docker命令

 

docker命令html

kokonode

1、docker命令

1. docker image 操做命令

  1. sudo docker image ls (or) docker images 查看系統全部image
  2. sudo docker pull ubuntu:14.04 安裝 ubuntu 14.04 image
    • sudo docker pull bitnami/wordpress 安裝bitnami的wordpress image
  3. docker image rm [image ID] (or) docker rmi [image ID] 刪除image

2. Dockerfile 編譯

  1. docker image build (or) docker build # 將Dockerfile 編譯成 image
  2. docker build -t xiaopeng163/hello-world . 在當前目錄編譯Dockerfile
  3. docker history [image_ID] 查看image生成過程

3. 容器管理

  1. docker run xiaopeng163/hello-world docker運行image
    • docker run -it ubuntu 交互式運行ubuntu container
    • docker run -it [image] /bin/bash 表示進入containe的 shell中
    • docker run -d [image] 後臺運行
    • docker run -d --name=demo laosuaidami/flask-hello-world 指定容器名字
  2. docker container ls 當前本地正在運行的程序
  3. docker container ls -a or docker ps -a 全部的容器,包括正在運行的,和已經退出的
  4. docker container rm [containerID] (or) docker rm [containerID] 刪除容器,包括正在運行的,和已經退出的
  5. docker container ls -aq (or) docker container ls -a|awk{'print$1'}
  6. docker rm $(docker container ls -aq) 刪除全部container
  7. docker rm $(docker container ls -f 'status=exited' -q) 刪除已經結束的container
  8. docker container commit (or) docker commit 修改container後變成新的container
    • docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
    • eg:docker commit quirky_chatelet hewei/centos-vim-f
  9. docker exec -it [container id] [要執行的命令] 進入正在運行的container中
    • docker exec -it 05554595249d /bin/bash
    • docker exec -it 05554595249d python
    • docker exec -it 05554595249d ip a 打印運行的容器IP地址
  10. docker stop/start [container id (or) container name] 中止容器
  11. docker inspect [container id (or) container name] 查看容器信息
  12. docker logs [container id (or) container name] 查看容器日誌
  13. sudo docker logs mysql1 查看安裝logs
  14. sudo docker volume ls 查看volume
  15. sudo docker volume rm [volume ID] 刪除volume
  16. docker tag SOURCEIMAGE[:TAG] TARGETIMAGE[:TAG] docker tag image:latest

4. 查看官方命令文檔

https://docs.docker.com/engine/reference/commandline/container/

5. docker hub 操做

  1. docker login / docker logout 登陸退出docker hub
  2. docker push laosuaidami/hello-world:latest 將docker推送到docker hub

2、Dockerfile 語法

FROM

FROM scratch   # 使用base image
FROM centos    # 使用base image
FROM ubuntu:14.04 
儘可能使用官方的image做爲base image

LABEL

LABEL maintainer="xiaoquwl@gmail.com"
LABEL version="1.0"
LABEL description="This is description"
相似代碼註釋

RUN

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

WORKDIR /root
WORKDIR /test    # 若是沒有會自動建立test目錄
WORKDIR demo
RUN pwd          # 輸出結果應該是 /test/demo

使用WORKDIR, 不要用  RUN cd! 儘可能使用絕對目錄!

ADD and COPY

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

ENV MYSQL_VERSION 5.6  # 設置常量
RUN apt-get install -y mysql-server="${MYSQL_VERSION}" && rm -rf /var/lib/apt/lists/*  # 引用常量
儘可能使用,增長可維護性

VOLUME and EXPOSE (存儲和網絡)

CMD and ENTRYPOINT

RUM: 執行命令並建立新的Image Layer
CMD: 設置容器啓動後默認執行的命令和參數
ENTRYPOINT: 設置容器啓動時執行的命令

eg:
ENTRYPOINT ["/usr/bin/stress"]    這是執行的命令
CMD ['--verbose']                 這是執行的參數 能夠外部輸入 也能夠設置默認 參數

3、容器的資源限制

1. 限制內存 --memory=xxxM

docker run --memory=200M laosuaidami/docker-stress --vm 1 --verbose --vm-bytes 500M

2. 限制cpu佔用權重 --cpu-shares=10

docker run --cpu-shares=10 --name=test1 laosuaidami/docker-stress --cpu 1 
docker run --cpu-shares=5 --name=test2 laosuaidami/docker-stress --cpu 1

4、docker網絡

1. Linux 建立 network namespace 並將其連通

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")

open

2. docker network namespace & docker bridge0

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

open

3. docker容器之間的link, 經過名字訪問docker,不須要ip : --link test1

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有方向性

4. 本身新建一個bridg

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進行相互訪問

5. container 的端口映射

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

5.1 container 的端口映射 -p 80:80 (容器內端口:容器外端口)

1. docker run --name web -d -p 80:80 nginx

6. host 和 none 網路模式

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"

7. 多容器的複雜部署

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 綁定本地端口

8. 多機通訊

  1. 建立overlay 網絡, 跨設備通訊 eg: sudo docker network create -d overlay demo

5、數據持久化

1. Date Volume方法:建立MySQL container (Dockerfile: VOLUME /var/lib/mysql)

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

2. Bind Mouting方法:docker run -v /home/aaa:/root/aaa

至關於共享文件夾 開發利器 便於調試容器內的代碼,本地修改便可實現
docker run -d -v $(pwd):/usr/share/nginx/html -p 80:80 --name web laosuaidami/my-nginx

6、docker compose 主要是應用在開發場景下,方便使用,是本地開發工具,能在本機上部署

1. 部署wordpress

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

2. docker compose

2.1 docker compose 命令

2.1.1 安裝 docker compose

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

2.1.2 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

2.2 service

2.2.1 選用docker hub image

2.2.2 選用本地Dockerfile

2.3 Volumes

2.4 Network

2.5 水平擴展和負載均衡

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容器的數量

7、容器編排:Swarm mode


搭建 3 nodes swarm cluster setup

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/

Swarm 命令

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. mysql + wordpress + swarm 在swarm集羣裏經過service部署wordpress

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

2. 集羣服務間通訊之RoutingMesh

2.1 Internal 方式

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.2 Ingress Network 方式

試驗環境和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

3. DockerStack 部署wordpress

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

4. Docker Secrets Managment

方法一:建立secrete

1. 新建文件將密碼寫入其中:假如文件名叫password
2. 建立secrete: docker secret create [OPTIONS] SECRET [file|-], 注意此步完成後能夠刪除password文件了!!!
    eg: docker secret create my-pw password
3. 查看 secrete:
    eg: docker secret ls

方法二:建立secrete

1. 命令行建立 secret:
    echo "root" | docker secret create my-pw2 -
2. 刪除secret
    docker secret rm my-pw2

使用 secrete

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

更新service

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      # 每次更新延時

8、Docker Cloud 之自動 build Docker image

相關文章
相關標籤/搜索