1. 程式人生 > >三、docker 容器

三、docker 容器

三、容器

建立容器常用選項 docker run …

docker create 建立完之後不啟動
docker run 生成一個容器 & 啟動
docker run -itd 互動、偽終端、後臺執行
docker ps 檢視執行著的容器 ps -a 看所有,ps -l 檢視最新容器
–add-host list

例1:(1)生成一個容器,名字隨意,不帶–add-host引數。
這裡寫圖片描述
docker ps
這裡寫圖片描述

docker exec fervent_ritchie cat /etc/hosts

這裡寫圖片描述
(2) 生成一個容器,名字隨意,帶–add-host 引數

docker run -itd --add-host  abc:192.168.1.123  ubuntu

這裡寫圖片描述

這裡寫圖片描述

–cap-add 新增linux特性到容器
–cid-file /tmp/a.txt 將容器ID儲存到檔案中
docker run –cidfile /tmp/a.txt ubuntu 儲存容器的pid 到一個檔案中,方便統一管理
–dns 8.8.8.8 docker run -itd –dns 8.8.8.8 ubuntu
-e 和–env-file將環境變數寫到檔案中 docker run -itd -e TEST=123 ubuntu
–expose 3306 docker run -itd –expose 80 ubuntu ,docker ps -l 檢視
-h hostname docker run -itd ubuntu ,隨機生成一個容器,hostname也是隨機生成的(hostname = 容器ID),如下:

這裡寫圖片描述
如果我想自定義指定,docker run -itd -h songyt ubuntu。

【–ip】 可以制定IP,但是必須在網段範圍內
docker network create –subnet=10.0.0.0/16 network_10 先建個網段
docker network ls 檢視所有網段

這裡寫圖片描述
docker run -itd –net=network_10 –ip 10.0.0.123 ubuntu
docker ps -l
這裡寫圖片描述
docker inspect keen_heisenberg #能看到如下資訊表示配置成功。
這裡寫圖片描述

–link #新增host記錄,根據已有hostname的關聯一下
docker run -itd -h songyt ubuntu
這裡寫圖片描述

重新生成一個容器c_b,關聯下
這裡寫圖片描述
c_a IP是0.7,c_b 是0.8
–log-driver (none,name,json,syslog,fluentd…)
#指定日誌位置
elk專業日誌分析工具
docker run -itd –name c_c –log-driver syslog ubuntu
tail -f /var/log/syslog #容器中的日誌都會到宿主機的此檔案中
–log-opt
–oom-kill-disable
-p 宿主機埠:容器埠
-P
expose
restart always/
restart on-failiure:3
ulimit #修改最大描述符
docker run -itd –name c_d –ulimit nproc=10240 –ulimit nofile=65535 ubuntu
docker attach c_d
ulimit -a 確認
-v 資料持久化
–volumes-from list
-w #進入容器後所在的工作目錄
–cpu-period int
–cpu-quota int
-c –cpu-shares int
–cpuset-cpus
–device-read-bps list
–device-read-iops list
–device-write-iops list
-m –memory bytes #限制記憶體
–memory-reservation bytes
–memory-swap bytes
–memory-swappiness int
–storage-opt list #限制磁碟空間只支援devicemapper儲存驅動
docker run -itd –name c_e -m 10240000 ubuntu
docker attach c_e
cd /sys/fs/cgroup
cat memory.limit _in_bytes
grep 上次輸出的值 *
free -m
exit
mount #建立一個容器的時候,預設從宿主機上掛載3個檔案,/etc/resove.conf,/etc/hostname,/etc/hosts,每次重啟,都掛載一次
–net docker run -itd –net host ubuntu
docker inspect cID

管理命令 docker …

執行場景:是在容器生成後,進行的管理操作
基本命令

start、stop 啟動、關閉
attach
rm docker rm -f $(docker ps -qa) 刪除所有的容器
kill 休眠
pause、unpause
rename docker rename c_a c_b
inspect 檢視所有
exec 體會不同:
docker exec c_a ls
docker exec -it c_a ls 互動式地輸出到標準輸出,等同於下面
docker exec -it c_a /bin/bash
top 顯示容器中執行的程序 docker top c_a
port docker port c_a
cp 在 宿主機與容器之間,相互copy 檔案
docker cp a.txt c_a:/home; docker exec -it c_a ls /home
.. docker cp c_a:/z.txt /tmp
diff
logs docker logs c_a
stats 動態檢視 容器利用率 ,互動式列印用docker stats –no-stream c_a
update 容器生成後修改一些配置 docker update –help
events docker events; 不針對具體docker容器,針對整個docker,可指定時間

資料持久化

資料卷

即:將宿主機目錄掛載到容器目錄
特點:
這裡寫圖片描述
例子:
(1) 假設宿主機/container_data/web 沒有資料,現在掛載下:

docker run -itd --name web01 -v /container_data/web:/data ubuntu

在/container_data/web 下:touch a.txt

docker exec web01 ls /data  

(2) 假設宿主機有資料時掛載,容器裡也會有資料
接著(1)的操作:

docker run -itd --name web02 -v /container_data/web:/data ubuntu
docker exec web02 ls /data 也是有資料的

容器資料卷

即:將一個執行的容器作為資料卷,讓其他容器 通過掛載這個容器 實現資料共享。
執行著的容器(需要先共享出一個數據卷):

docker run -itd --name share  -v /data ubuntu            #把容器的/data 目錄作為共享卷
docker run -itd --name oa --volumes-from share  ubuntu   #oa容器掛載share容器
在共享的share容器裡建立:docker exec share  touch /data/index.php
docker exec share ls /data       #確認下共享目錄是否建立成功
docker exec oa   ls /data        #到新建的oa的/data/ 下看是否同步了過來

ps:容器 共享出去的目錄是雙方同步的,類似於百度雲盤的共享目錄。

搭建lnmp網站平臺

建立mysql資料庫容器

1.  訪問:hub.docker.com/explore
2.  docker run -itd --name lnmp_mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root mysql --character-set-server=utf8
3.  telnet 127.0.0.1 3306    #可以ping通
4.  iptables -t nat -vnL      #其實是在防火牆裡添加了條規則,肯最後一行
5.  docker exec lnmp_mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -e"create database wp"'

建立PHP環境容器

1.  docker search php    #選第一個
2.  docker run -itd --name lnmp_web --link lnmp_mysql:db -p 88:80 -v /container_data/web:/var/www/html richarvey/nginx-php-fpm
3.  在宿主機/container_data/web/ 下建立index.php <?php phpinfo() ?> 

在瀏覽器訪問:IP:88 #訪問不到

iptables -A input -s 宿主機Ip -j accept   #將iptables規則清空,再重置了下IP規則

以wordpress部落格為例除錯

wget  https://cn.wordpress.org/wordpress-4.7.4-zh_CN.tar.gz
tar zxvf wordpress-4.7.4-zh_CN.tar.gz
mv wordpress/*  /container_data/web/

這裡寫圖片描述

瀏覽器測試訪問: http:IP:88