docker命令html
kokonode
https://docs.docker.com/engine/reference/commandline/container/
FROM scratch # 使用base image FROM centos # 使用base image FROM ubuntu:14.04 儘可能使用官方的image做爲base image
LABEL maintainer="xiaoquwl@gmail.com" LABEL version="1.0" LABEL description="This is description" 相似代碼註釋
RUN yum update && yum install -y vim \ python-dev # 反斜線換行 RUN apt-get update && apt-get instll -y perl\ pwgen --no-install-recommends && rm -rf \ /var/lib/apt/lists/* # 注意清理cache RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME'
WORKDIR /root WORKDIR /test # 若是沒有會自動建立test目錄 WORKDIR demo RUN pwd # 輸出結果應該是 /test/demo 使用WORKDIR, 不要用 RUN cd! 儘可能使用絕對目錄!
ADD hello / ADD test.tar.gz / # 添加的根目錄並解壓 WORKDIR /root ADD hello test/ # root/test/hello WORKDIR /root COPY hello test/ 大部分狀況, COPY 優於 ADD ADD 除了 COPY 還有額外功能(解壓)! 添加遠程文件/目錄請使用curl或者wget !
ENV MYSQL_VERSION 5.6 # 設置常量 RUN apt-get install -y mysql-server="${MYSQL_VERSION}" && rm -rf /var/lib/apt/lists/* # 引用常量 儘可能使用,增長可維護性
RUM: 執行命令並建立新的Image Layer CMD: 設置容器啓動後默認執行的命令和參數 ENTRYPOINT: 設置容器啓動時執行的命令 eg: ENTRYPOINT ["/usr/bin/stress"] 這是執行的命令 CMD ['--verbose'] 這是執行的參數 能夠外部輸入 也能夠設置默認 參數
docker run --memory=200M laosuaidami/docker-stress --vm 1 --verbose --vm-bytes 500M
docker run --cpu-shares=10 --name=test1 laosuaidami/docker-stress --cpu 1 docker run --cpu-shares=5 --name=test2 laosuaidami/docker-stress --cpu 1
1. docker run -d --name=test1 busybox /bin/sh -c "while true; do sleep 3600; done" 2. ip a 在shell中查看IP 3. sudo ip netns list # 查看network的namespace 4. sudo ip netns delete [namespace] 刪除network namespace 5. 建立network namespace 1. sudo ip netns add test1 2. sudo ip netns add test2 6. sudo ip netns exec [namespace/ test1] ip a 查看network namespace ip 7. ip link 查看IP連接 8. sudo ip netns exec [namespace/ test1] ip link set dev lo up 啓動 network namespace lo 網絡連接 9. sudo ip link add veth-test1 type veth peer name veth-test2 添加一對veth link 10. 添加link到network namespace 1. sudo ip link set veth-test1 netns test1 2. sudo ip link set veth-test2 netns test2 11. 分別給test1 test2 分配IP地址 1. sudo ip netns exec test1 ip addr add 192.168.1.1/24 dev veth-test1 2. sudo ip netns exec test2 ip addr add 192.168.1.2/24 dev veth-test2 12. 啓動 network namespace lo 網絡連接 1. sudo ip netns exec test1 ip link set dev veth-test1 up 2. sudo ip netns exec test2 ip link set dev veth-tes2 up 13. 測試網絡的連通性 1. sudo ip netns exec test1 ping 192.168.1.2 2. sudo ip netns exec test2 ping 192.168.1.1 14. 建立網絡 docker network create [OPTIONS] NETWORK eg: sudo docker network create -d overlay demo # -d, --driver string-->Driver to manage the Network (default "bridge")
1. docker network ls 查看docker網絡network 信息 2. sudo docker network inspect [network id] 查看network的信息(可查看network上橋接的ip) - sudo docker network inspect 5bb68053a8c3 3. sudo docker exec test1 ip a 查看test1容器的IP信息 4. brctl show 顯示Linux網橋 sudo yum install bridge-utils
1. 先建立test1容器,在建立test2容器 並讓test2連接到test1上 1. docker run -d --name=test1 busybox /bin/sh -c "while true; do sleep 3600; done" 2. docker run -d --name=test2 --link test1 busybox /bin/sh -c "while true; do sleep 3600; done" 3. 測試一下(能夠用test1 代替 test1 container的ip) 1. sudo docker exec -it test2 /bin/sh 進入test2的shell 2. ping test1 測試可否ping通 3. test1:3306 便可訪問MySQL數據庫 2. link有方向性
1. 新建bridg: sudo docker network create -d bridge my-bridge 2. 建立container時指定bridge: --network my-bridge docker run -d --name test3 --network my-bridge busybox /bin/sh -c "while true; do sleep3600; done" 3. 給已經建立的container更換bridge docker network connect my-bridge test2 test2 會同時鏈接到bridge和my-bridge 4. 若是兩個container同時鏈接到一個用戶本身定義的bridge時, 這兩個container默認是相互link,便可以經過container name 代替 ip進行相互訪問
1. 建立Nginx容器 1. docker run --name web -d nginx 2. 進入容器bash 1. docker exec -it web /bin/bash 3. 中止並刪除web container 1. docker stop web 2. docker rm web
1. docker run --name web -d -p 80:80 nginx
1. host: --network host 當前容器和主機共用ip和mac docker run -d --name test1 --network host busybox /bin/sh -c "while true; do sleep3600; done" 2. none: --network none 當前容器沒有ip和mac docker run -d --name test1 --network none busybox /bin/sh -c "while true; do sleep3600; done"
redis 和 服務分開部署,試驗代碼chapter4/flask-redis 給容器添加環境變量,-e PENG=value 1. 啓動redis container 1. sudo docker run -d --name redis redis 2. 編譯Docker,並啓動container 1. sudo build -t laosuaidami/flask-redis . 2. sudo docker run -d --link redis --name flask-redis -e REDIS_HOST=redis laosuaidami/flask-redis 3. 進入container bash 中查看 1. docker exec -it flask-redis /bin/bash 2. 在bash中輸入env 能夠看到 REDIS_HOST=redis 3. 在bash中輸入 curl 127.0.0.1:5000 能夠訪問服務 4. 重啓 flask-redis ,先中止後關閉再重啓 1. 重啓命令加 -p 5000:5000 綁定本地端口
1. sudo docker run -d --name mysql1 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql 2. docker volume ls / docker volume rm [volume name] / docker volume inspect 查看/刪除 volume 3. volume起別名(若別名存在則使用已有數據庫): -v 別名:/var/lib/mysql 1. sudo docker run -d -v mysql_test:/var/lib/mysql --name mysql1 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql
至關於共享文件夾 開發利器 便於調試容器內的代碼,本地修改便可實現 docker run -d -v $(pwd):/usr/share/nginx/html -p 80:80 --name web laosuaidami/my-nginx
1. 建立MySQL容器 1. sudo docker run -d --name mysql -v mysql_data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=wordpress mysql:5.7 2. sudo docker run -d --name mysql -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=wordpress mysql:5.7 2. 建立WordPress容器 1. sudo docker run -d -e WORDPRESS_DB_HOST=mysql:3306 --link mysql -p 8080:80 wordpress 2. sudo docker run -d -e WORDPRESS_DB_HOST=mysql:3306 --link mysql -p 8080:80 wordpress
1. sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose 2. sudo chmod +x /usr/local/bin/docker-compose
1. docker-compose -f docker-compose.yml up -d # 啓動yml文件中container 2. docker-compose ps # container list 3. docker-compose stop # stop services 4. docker-compose down # stop services and remove 5. docker-compose start # start services 6. docker-compose images # docker-compose 中的使用的 list images 7. docker-compose exec [options] [-e KEY=VAL...] SERVICE COMMAND [ARGS...] 1. eg: docker-compose exec mysql bash 2. eg: docker-compose exec wordpress bash 8. docker-compose build 1. 能夠先將Dockerfile進行編譯成image,再使用 docker-compose up 來啓動,固然直接使用docker-compose up 也是能夠的 2. 當Dockerfile更改後也能夠先docker-compose build,再docker-compose up
1. docker-compose scale 命令 # set number of container for a service up [options] [--scale SERVICE=NUM...] [SERVICE...] 1. docker-compose up --scale web=3 -d # 同時開啓3個web container 2. HAProxy + scale 負載均衡的部署服務 1. 先執行docker-compose.yml 啓動服務, 再啓動多個APP,實驗環境chapter6/lb-scale 1. docker-compose up -d 2. docker-compose up --scale web=3 -d # 能夠經過scale增長、減小web容器的數量
1. Vagrant + Virtualbox 1. 先初始化manager的cluster,宣告地址 1. docker swarm init --advertise-addr=192.168.205.10 2. 添加worker到manage cluster 1. docker swarm join --token SWMTKN-1-5zj189y4mz8yttawc6jlq1vb86hcu4lbzzo1nts1yzu7d9teaa-7g0w1oyppjynrqki1zy1pk3xi 192.168.205.10:2377 2. Docker Machine + Virtualbox 1. docker-machine creat swarm-manager 2. docker-machine creat swarm-work1 3. docker-machine creat swarm-work2 4. 以後和Vagrant + Virtualbox的方法同樣了 3. Play with docker https://labs.play-with-docker.com/
1. docker swarm init --advertise-addr=192.168.205.10 # 先初始化cluster,宣告地址,讓其餘節點指定此節點的存在 2. docker node ls # list nodes in the swarm 3. 建立service docker service create [OPTIONS] IMAGE [COMMAND] [ARG...] eg: docker service create --name demo busybox sh -c "while true; do sleep 3600; done" 4. 查看service docker service ls 5. 查看service在那臺設備上 docker service ps [service name] eg: docker service ps demo 6. docker service scale # 橫向擴展,平均分配在各節點上 ,service container被刪除後,會自動重啓,平均分佈在各cluster上 docker service scale SERVICE=REPLICAS [SERVICE=REPLICAS...] eg: docker service scale dome=5 平均部署到各節點上 7. 刪除service ocker service rm SERVICE [SERVICE...] eg: docker service rm demo
1. 建立overlay network 1. docker network create -d overlay demo # 建立名爲demo的overlay網絡 2. 建立 MySQL service sudo docker service create --name mysql --env MYSQL_ROOT_PASSWORD=root --env MYSQL_DATABASE=wordpress --network demo --mount type=volume,source=mysql-date,destination=/var/lib/mysql mysql:5.7 3. 建立 WordPress service sudo docker service create --name wordpress --env WORDPRESS_DB_PASSWORD=root --env WORDPRESS_DB_HOST=mysql -p 80:80 --network demo wordpress
1. 建立overlay network docker network create -d overlay demo # 建立名爲demo的overlay網絡 2. 建立 whoami service 1. docker service create --name whoami -p 8000:8000 --network demo -d jwilder/whoami 2. docker service create --name client -d --network demo busybox sh -c "while true; do sleep 3600; done" 3. 進入 client container shell 中: 1. ping whoami # 結果ip爲 10.0.0.7 2. 經過 docker service scale whoami=3 開啓多個whoami container後,ping whoami 結果仍然爲 10.0.0.7 3. 在 client container 中運行 nslookup tasks.whoami 發現有3個ip 10.0.0.15~10.0.0.17, 4. 因而可知 10.0.0.7 是一個虛擬ip,他只和server name 相關 4. 經過VIP屢次訪問請求whoami會發現輪流出現container id ,其實內部自帶負載均衡,主要須要使用虛擬ip訪問才行 5. LVS--> Linux virtual Server lvs + keepalived 配置一個高可用的負載均衡
LVS--> Linux virtual Server 詳見官方文檔python
試驗環境和2.1同樣,在各個note server shell 運行:curl 127.0.0.1:8000, 會發現返回不一樣container id 1. 查看轉發規則運行命令:sudo iptables -nL -t nat 2. brctl show 顯示Linux網橋 sudo yum install bridge-utils 3. docker network inspect docker_gwbridge # 查看'ingress-sbox'ip 4. sudo ls /var/run/docker/netns 查找'ingress-sbox'文件 5. sudo nsentre --net=/var/run/docker/netns/ingress-sbox 進入'ingress-sbox'文件 6. ip a # 查看ip 1. 查看防火牆 iptables -nL -t mangle 2. sudo yum install ipvsadm 使用命令 ipvsadm -l
1. 運行yml文件, docker stack deploy [OPTIONS] STACK eg: docker stack deploy -c=docker-compose.yml wordpress 2. 查看stack eg: docker stack ls 3. 查看stack的具體細節 eg: docker stack ps wordpress 4. 查看stack services eg: docker stack services wordpress
1. 新建文件將密碼寫入其中:假如文件名叫password 2. 建立secrete: docker secret create [OPTIONS] SECRET [file|-], 注意此步完成後能夠刪除password文件了!!! eg: docker secret create my-pw password 3. 查看 secrete: eg: docker secret ls
1. 命令行建立 secret: echo "root" | docker secret create my-pw2 - 2. 刪除secret docker secret rm my-pw2
1. 建立docker service create 使用--secret指定secret # Specify secrets to expose to the service eg: docker service create --name demo --secret my-pw busybox sh -c "while true; do sleep 3600; done" 2. 查看secrete,進入容器:docker exec -it demo sh eg: cat /run/secrets/my-pw 3. mysql service 建立的時候指定secret文件 eg: docker service create --name db --secret my-pw -e MYSQL_ROOT_PASSWORD_FILE=/run/secrets/my-pw mysql:5.7 4. compose 中使用secret: version: '3.7' services: web: image: wordpress ports: - 8080:80 secrets: - my-pw environment: WORDPRESS_DB_HOST: mysql WORDPRESS_DB_PASSWORD_FILE: /run/secrets/my-pw networks: - my-network depends_on: - mysql deploy: mode: replicated replicas: 3 restart_policy: condition: on-failure delay: 5s max_attempts: 3 update_config: parallelism: 1 delay: 10s mysql: image: mysql:5.7 secrets: - my-pw environment: MYSQL_ROOT_PASSWORD_FILE: /run/secrets/my-pw MYSQL_DATABASE: wordpress volumes: - mysql-data:/var/lib/mysql networks: - my-network deploy: mode: global placement: constraints: - node.role == manager volumes: mysql-data: networks: my-network: driver: overlay # secrets: # my-pw: # file: ./password secrets: my-pw: external: true # name: my-pw2
1. 新建network: docker network create -d overlay demo 2. 建立service:docker service create --name web --publish 8080:5000 --network demo xiaopeng163/python-flask-demo:1.0 3. 增長web容器:docker service scale web=2 4. 更新image:docker service update --image xiaopeng163/python-flask-demo:2.0 web 5. 更新端口:ocker service update --publish-rm 8080:5000 --publish-add 8888:5000 web 7. compose.yml 更新, 須要更改yml文件,而後從新運行compose.yml文件,而且能夠在yml中deploy字段設置更新模式 deploy: mode: replicated replicas: 3 restart_policy: condition: on-failure delay: 5s max_attempts: 3 update_config: parallelism: 1 # 同時容許幾個scale更新 delay: 10s # 每次更新延時