Docker學(xué)習(xí)筆記

一、基礎(chǔ)

  1. docker是使用Go語言在Linux上是基于Linux內(nèi)核的cgroup,namespace,以及AUFS類的Union FS等技術(shù)實(shí)現(xiàn)的容器。
  2. 管理命令
#啟動(dòng)
systemctl enable docker
systemctl start docker

#查看信息
docker info

#查看幫助
docker --help

二、鏡像

  1. 可以看做一個(gè)根文件系統(tǒng)
  2. 倉庫:一般使用如userName/ubuntu:14.04標(biāo)識(shí)倉庫中的鏡像
  3. 管理命令
#拉取鏡像
docker pull [選項(xiàng)] [Docker Registry 地址[:端口號(hào)]/]鏡像名稱[:標(biāo)簽]

#列出鏡像,IMAGE ID是唯一的
docker image ls
 REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
 hello-world         latest              2cb0d9787c4d        13 days ago         1.85kB
 
#刪除本地鏡像
docker image rm imageid

#查看鏡像詳情
docker image inspect nginx:1.12

#鏡像導(dǎo)出導(dǎo)入
docker image save eb40dcf64078> /root/mydjango-save-1016.tar
docker image load < /root/mydjango-save-1016.tar  
  1. Dockerfile
FROM debian:jessie   #指定基礎(chǔ)鏡像
RUN apt-get install -y gcc libc6-dev make    #或RUN ["可執(zhí)行文件", "參數(shù)1", "參數(shù)2"]
COPY package.json /usr/src/app/  #從上下文目錄中復(fù)制到目標(biāo)目錄;或COPY ["<源路徑1>",... "<目標(biāo)路徑>"]
WORKDIR <工作目錄路徑>  #指定工作目錄
USER <用戶名>    #指定當(dāng)前用戶
ENV NODE_VERSION 7.2.0   #定義環(huán)境變量
VOLUME ["<路徑1>", "<路徑2>"...]     #定義匿名數(shù)據(jù)卷,會(huì)自動(dòng)關(guān)聯(lián)到主機(jī)某個(gè)目錄;或VOLUME <路徑>
EXPOSE <端口1> [<端口2>...]  #開放端口


CMD <命令>   #容器啟動(dòng)后默認(rèn)執(zhí)行的命令(容器中無systemd概念),會(huì)被commad覆蓋,只能出現(xiàn)一次;或CMD ["可執(zhí)行文件", "參數(shù)1", "參數(shù)2"...]
ENTRYPOINT [ "curl", "-s", "http://ip.cn" ]   #如果定義了接入點(diǎn),那么執(zhí)行到CMD時(shí),CMD含義變?yōu)樘峁﹨?shù),只能出現(xiàn)一次



#docker build -t nginx:v3 .:通常在空目錄中放置Dockerfile,表示在上下文目錄中構(gòu)建鏡像

三、容器

  1. 實(shí)質(zhì)上即進(jìn)程
  2. 管理命令
#運(yùn)行鏡像
 #-d:容器后臺(tái)運(yùn)行
 #-m:限制最大內(nèi)存量
 #-cpus:限制最大cpu量
docker container run [options] image [commad] [arg...]

#啟動(dòng)停止?fàn)顟B(tài)的容器
docker container start myrunoob

#列出容器
docker container ls

#進(jìn)入容器
 #退出容器:exit
docker container exec -it 69d1 bash

#刪除容器
docker container rm myrunoob
docker container rm $(docker ps -aq)

#查看容器詳情
docker container inspect web
  1. 數(shù)據(jù)管理
#創(chuàng)建數(shù)據(jù)卷
docker volume create my-vol

#查詢所有數(shù)據(jù)卷
docker volume ls

#查看數(shù)據(jù)卷信息
docker volume inspect my-vol
[
 {
 "Driver": "local",
 "Labels": {},
 "Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
 "Name": "my-vol",
 "Options": {},
 "Scope": "local"
 }
 ]
 
 #啟動(dòng)容器時(shí)掛載數(shù)據(jù)卷
 docker run -d -P \
     --name web \
     --mount source=my-vol,target=/webapp \
     training/webapp \
     python app.py
     
 #刪除數(shù)據(jù)卷
 docker volume rm my-vol
 
 #直接綁定主機(jī)目錄
 docker run -d -P \
     --name web \
     --mount type=bind,source=/src/webapp,target=/opt/webapp \
     training/webapp \
     python app.py
  1. 網(wǎng)絡(luò)管理
    1. 支持的網(wǎng)絡(luò)模式
      • bridge:默認(rèn)的,限本主機(jī),可以通過容器名發(fā)現(xiàn)容器
      • Overlay:跨主機(jī),需滿足以下任一條件
        • docker運(yùn)行在Swarm模式中
        • docker引擎都連接到consul等上
    2. 管理命令
    #-P:Docker會(huì)隨機(jī)映射一個(gè)49000~49900的端口到容器開放的端口
    docker run -d -P training/webapp python app.py
    
    #-p:指定映射端口到容器端口
    docker run -d -p 5000:5000 training/webapp python app.py
    
    #查看容器的端口映射配置
    docker port nostalgic_morse 5000
    
    #創(chuàng)建網(wǎng)絡(luò)
    docker network create -d overlay multi_host
    
    #查看網(wǎng)絡(luò)
    docker network ls
    
    #移除網(wǎng)絡(luò)
    docker network rm multi_host
    

四、Docker Compose

  1. 定義和運(yùn)行多個(gè) Docker 容器的官方開源項(xiàng)目;用Python編寫,調(diào)用Docker服務(wù)提供的API實(shí)現(xiàn)
  2. 管理的單元
    • 服務(wù)(service):一個(gè)應(yīng)用容器
    • 項(xiàng)目(project):由一組關(guān)聯(lián)的應(yīng)用容器組成的一個(gè)完整業(yè)務(wù)單元
    # 管理的單元配置文件,默認(rèn)docker-compose.yml
    version: "3"
    services:
      db:
        image: mysql:5.7
        # 或者通過build指定Dockerfile的方式
        #build:
        #  context: ./dir
        #  dockerfile: Dockerfile-alternate
        volumes:
          - db_data:/var/lib/mysql
        restart: always
        environment:
          MYSQL_ROOT_PASSWORD: somewordpress
          MYSQL_DATABASE: wordpress
          MYSQL_USER: wordpress
          MYSQL_PASSWORD: wordpress
      wordpress:
        depends_on:
          - db
        image: wordpress:latest
        ports:
          - "8000:80"
        restart: always
        environment:
          WORDPRESS_DB_HOST: db:3306
          WORDPRESS_DB_USER: wordpress
          WORDPRESS_DB_PASSWORD: wordpress
    volumes:
      db_data:
        data:
          #instead of attempting to create a volume called [projectname]_data, Compose looks for an existing volume simply called data and mount it into the db service’s containers
          external: true
    
  3. 管理命令
#一般命令格式
 #-f:指定模板文件,默認(rèn)當(dāng)前目錄下docker-compose.yml
 #-p:指定項(xiàng)目名稱,默認(rèn)當(dāng)前目錄名為項(xiàng)目名
docker-compose [options] [COMMAND] [ARGS...]

#啟動(dòng)compose
docker-compose up

五、Docker Machine

  1. 負(fù)責(zé)在多種平臺(tái)上快速安裝Docker環(huán)境的官方開源項(xiàng)目
  2. 管理命令
#創(chuàng)建一臺(tái) Docker 主機(jī)
docker-machine create -d virtualbox test

#通過 SSH 登錄到主機(jī)
docker-machine ssh test

六、Docker Swarm

  1. Swarm是Docker內(nèi)置的Docker主機(jī)集群管理工具
    • 運(yùn)行 Docker 的主機(jī)可以主動(dòng)初始化一個(gè) Swarm 集群或者加入一個(gè)已存在的 Swarm 集群,這樣這個(gè)運(yùn)行 Docker 的主機(jī)就成為一個(gè) Swarm 集群的節(jié)點(diǎn) ( node )
    • 節(jié)點(diǎn)分為管理 ( manager ) 節(jié)點(diǎn)和工作 ( worker ) 節(jié)點(diǎn),管理節(jié)點(diǎn)默認(rèn)也作為工作節(jié)點(diǎn)
  2. 管理命令
#本地初始化一個(gè)Swarm集群,默認(rèn)是管理節(jié)點(diǎn)
#如果你的 Docker 主機(jī)有多個(gè)網(wǎng)卡,擁有多個(gè) IP,必須使用 --advertise-addr 指定 IP
$docker swarm init --advertise-addr 192.168.99.100
 Swarm initialized: current node (dxn1zf6l61qsb1josjja83ngz) is now a manager.
 To add a worker to this swarm, run the following command:
 docker swarm join \
 --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
 192.168.99.100:2377
 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

#創(chuàng)建一個(gè)docker主機(jī)并加入Swarm集群
$docker-machine create -d virtualbox worker1
$docker-machine ssh worker1
 docker@worker1:~$ docker swarm join \
     --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
     192.168.99.100:2377
 This node joined a swarm as a worker.
 
 #查看集群
 docker node ls
 
 #向集群中部署服務(wù)
 #部署后我們使用瀏覽器,輸入任意節(jié)點(diǎn) IP ,即可看到 nginx 默認(rèn)頁
 docker service create --replicas 3 -p 80:80 --name nginx nginx:1.13.7-alpine
 
 #查看服務(wù)
 docker service ls
 ID NAME MODE REPLICAS IMAGE PORTS
 kc57xffvhul5 nginx replicated 3/3 nginx:1.13.7-alpine *:80->80/tcp
 
 #查看服務(wù)詳情
 docker service ps
 ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
 pjfzd39buzlt nginx.1 nginx:1.13.7-alpine swarm2 Running Running about a minute ago
 hy9eeivdxlaa nginx.2 nginx:1.13.7-alpine swarm1 Running Running about a minute ago
 36wmpiv7gmfo nginx.3 nginx:1.13.7-alpine swarm3 Running Running about a minute ago
 
 #刪除服務(wù)
 docker service rm
 
 
  1. 使用docker-compose.yml
#配置文件一般如下:
 version: "3"
 services:
   wordpress:
     image: wordpress
     ports:
       - 80:80
     networks:
       - overlay
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress
     deploy:
       mode: replicated
       replicas: 3
   db:
     image: mysql
     networks:
       - overlay
     volumes:
       - db-data:/var/lib/mysql
     environment:
       MYSQL_ROOT_PASSWORD: somewordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress
     deploy:
       placement:
         constraints: [node.role == manager]
   visualizer:   #提供可視化界面服務(wù)
     image: dockersamples/visualizer:stable
     ports:
       - "8080:8080"
     stop_grace_period: 1m30s
     volumes:
       - "/var/run/docker.sock:/var/run/docker.sock"
     deploy:
       placement:
         constraints: [node.role == manager]
   volumes:
     db-data:
   networks:
     overlay:
     
 #部署服務(wù)
 docker stack deploy -c docker-compose.yml wordpress
 
 #查看服務(wù)
 docker stack ls
 
 #移除服務(wù)
 docker stack down
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容