在實際應用場景中,不管是從安全仍是可配置方面去考慮,不少參數是比較適合用環境變量加載進去的,好比數據庫的鏈接信息,時區,還有字體支持等等,在建立容器的時候其實均可以使用-e 指定key/value進行傳遞環境變量進去。linux
sh-4.2# docker run -itd --name test-env -e TZ='Asia/Shanghai' 172.25.46.9:5001/centos6.8-jdjr-test-app
ee20b44301e27c16eae63dab243d293054178dd5f819c23d44bd9e534208bb42
sh-4.2# docker exec -it test-env date
2017年 01月 17日 星期二 10:35:17 CST
sh-4.2# date
Tue Jan 17 10:35:21 CST 2017
能夠看到加了時區環境變量的容器已經和宿主機在同一個時區(CST),而且時間和宿主機基本同步
sh-4.2# docker run -itd --name test 172.25.46.9:5001/centos6.8-jdjr-test-app
d6a02874b999ff4eea79e3b302148b42043af01c89a5d31e5d858e0806f9077a
sh-4.2# docker exec -it test date
2017年 01月 20日 星期五 01:43:48 Asia
默認沒有加時區環境變量的容器仍是Asia
解決辦法:
建立容器的時候,使用-e 將時區信息傳入到容器內部。
sh-4.2# docker run -itd --name test-env -e TZ='Asia/Shanghai' images
sh-4.2# docker run -itd --name volume-test --storage-opt size=70G 172.25.46.9:5001/centos6.8-jdjr-test-app
18d47e69802aa84df00182885b256c50ebc56e15d8e6990fc1e187ffe254171e
sh-4.2# docker exec -it volume-test df -H | grep rootfs
rootfs 76G 1.5G 74G 2% /
sh-4.2# docker exec -it test-env df -H | grep rootfs
rootfs 11G 1.5G 9.3G 14% /
在docker中刪除容器須要指定容器名或者容器id,可是在容器比較多,而且狀態不一的狀況下刪除容器仍是須要走下心的。不過好處是docker ps默認提供了不少好用的功能,能夠很方便地管理容器(建立容器的時候若是加上label後更方便哦)。nginx
原理:先用docker ps -a -q 輸出全部容器的container id(-f 表示過濾參數或者輸出格式),而後做爲docker rm 的參數進行批量刪除
輸出全部容器的name:
sh-4.2# docker ps --format='{{.Names}}'
test-env
test-args
test-run
輸出全部容器名包含test的容器,並打印容器名
sh-4.2# docker ps -f name=test --format='{{.Names}}'
test-env
test-args
test-run
查看退出狀態的容器,並打印容器名
sh-4.2# docker ps -f status=exited --format="{{.Names}}"
thirsty_brahmagupta
clever_mestorf
hopeful_morse
stoic_morse
elated_williams
tender_jepsen
reverent_mirzakhani
刪除全部容器:
sh-4.2# docker rm -f -v $(docker ps -a -q)
刪除/啓動全部退出的容器:
sh-4.2# docker rm/start $(docker ps -qf status=exited)
刪除全部鏡像:
sh-4.2# docker rmi $(docker images -q)
查看懸掛鏡像:
sh-4.1# docker images -qf dangling=true
只查看鏡像或者容器指定的信息(在docker1.10以後才支持的)
只列出鏡像的id以及倉庫名稱:
sh-4.2# docker images --format "{{.ID}}: {{.Repository}}"
67591570dd29: centos
0a18f1c0ead2: rancher/server
只列出容器的相關id,image,status和name
sh-4.2# docker ps --format "{{.ID}}: {{.Image}} : {{.Status}} : {{.Names}}"
66b60b72f00e: centos : Up 7 days : pensive_poincare
或者本身從新定義列,就和原生差很少:
sh-4.2# docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Status}}\t{{.Names}}"
CONTAINER ID IMAGE STATUS NAMES
66b60b72f00e centos Up 7 days pensive_poincare
*formatter.containerContext
sh-4.2# docker run -itd --name volume-test --storage-opt size=70G --label zone=test 172.25.46.9:5001/centos6.8-jdjr-test-app
c3772397e58e663095c2c0fd8d688b3d41b494097999ec2b6d6b7c509d23a138
建立容器的時候定義一個label,表示該容器在test這個區域
使用定義的label進行快速檢索容器,並進行下一步操做(好比刪除啦,更新啦)
sh-4.2# docker ps -qf label=zone=test
c3772397e58e
sh-4.2# docker ps -f label=zone=test --format='{{.Names}}'
volume-test
查看容器的devicemapper設備:
sh-4.2# docker inspect -f '{{.GraphDriver.Data.DeviceName}}' nginx
docker-8:1-67411759-7c9d6d3327b02659c81bcb70bf6a4c7a45df6a589af2a2d42a387dc0e90d4913
查看容器的PID:
sh-4.2# docker inspect -f '{{.State.Pid}}' nginx
27521
查看容器name:
sh-4.2# docker inspect -f '{{.Name}}' nginx
/nginx
docker管理命令常常須要指定各類參數,經過linux的alias命令將默認的參數預約義起來,能夠很方便的進行管理容器。docker
sh-4.2# alias dockerrm='docker rm -f -v'
sh-4.2# alias dockerexec='docker exec -it'
sh-4.2# alias dockerrmimage='docker rmi'
sh-4.2# dockerrm volume-test
volume-test
sh-4.2# dockerexec volume-test ls
bin dev export lib media opt root selinux sys usr
boot etc home lib64 mnt proc sbin srv tmp var
sh-4.2# dockerexec volume-test bash
bash-4.1#
docker run 的時候加參數--restart=always
docker1.10以後才支持的動態調整
sh-4.2# dockerexec test-env cat /sys/fs/cgroup/memory/memory.limit_in_bytes
9223372036854775807
sh-4.2# cat /sys/fs/cgroup/memory/memory.limit_in_bytes
9223372036854775807
能夠看到,默認沒有給容器限制內存,它會共享宿主機的全部內存
動態調整內存爲2014M:
sh-4.2# docker update -m 2014M test-env
test-env
sh-4.2# dockerexec test-env cat /sys/fs/cgroup/memory/memory.limit_in_bytes
2111832064
開啓user namespace:
啓動docker的時候加參數--userns-remap=default
https://docs.docker.com/engine/reference/commandline/dockerd/#/daemon-user-namespace-options
容器內部文件拷貝到宿主機:
sh-4.2# docker cp jupyter-70002111:/home/70002111/教程-研究功能介紹.ipynb .
sh-4.2# ls
Dockerfile 教程-研究功能介紹.ipynb
宿主機文件拷貝到容器:
sh-4.2# docker cp Dockerfile jupyter-70002111:/home/70002111/
sh-4.2# docker exec -it jupyter-70002188 ls
Dockerfile
$ docker network create \
-d bridge \
--subnet=192.168.57.0/24 \
--ip-range=192.168.57.32/28 \
--gateway=192.168.57.11 \
--aux-address DefaultGatewayIPv4=192.168.57.1 \
-o com.docker.network.bridge.name=brnet \
brnet
$ brctl addif brnet eth2
$ docker run --net=brnet -it busybox ifconfig
注意其它主機的 --ip-range 和 --gateway 須要作對應調整。
這種拓撲是,容器內 eth0 鏈接 brnet 接口,該接口直接經過 eth2 訪問交換。
容器內部第一個進程編號通常爲1
shell
$ docker exec -it container-name taskset -c -p 1
pid 1's current affinity list:0-3