三、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