實用的Docker入門


1 Docker概述

Docker和虛擬機一樣,都擁有環境隔離的能力,但它比虛擬機更加輕量級,可以使資源更大化地得到應用。首先來看Docker的架構圖:

理解其中幾個概念:

  • Client(Docker客戶端):是Docker的用戶界面,可以接受用戶命令(docker build,docker pull...)和配置標識,並與Docker daemon通信
  • Images(Docker鏡像):是一個只讀模板,含創建Docker容器的說明,它與操作系統的安裝光盤有點像
  • Containers(容器):鏡像的運行實例,鏡像與容器的關系類比面向對象中的類和對象
  • Registry:是一個集中存儲與分發鏡像的服務。最常用的Docker Registry是官方的Docker Hub

2 Docker安裝

CentOS7系統下安裝Docker為例。Docker 軟件包和依賴包已經包含在默認的 CentOS-Extras 軟件源里,安裝命令如下:

yum -y install docker

啟動docker后台服務:

service docker start

驗證是否安裝成功:

[root@localhost hemi]# docker version
Client:
 Version:         1.13.1
 API version:     1.26
 Package version: <unknown>
 Go version:      go1.8.3
 Git commit:      774336d/1.13.1
 Built:           Wed Mar  7 17:06:16 2018
 OS/Arch:         linux/amd64

Server:
 Version:         1.13.1
 API version:     1.26 (minimum version 1.12)
 Package version: <unknown>
 Go version:      go1.8.3
 Git commit:      774336d/1.13.1
 Built:           Wed Mar  7 17:06:16 2018
 OS/Arch:         linux/amd64
 Experimental:    false

更詳細的針對各操作系統的安裝見官方文檔:https://docs.docker.com/install/

 

鏡像加速

鑒於國內網絡問題,后續拉取 Docker 鏡像十分緩慢,我們可以需要配置加速器來解決,我使用的是網易的鏡像地址:http://hub-mirror.c.163.com。

新版的 Docker 使用 /etc/docker/daemon.json(Linux) 或者 %programdata%\docker\config\daemon.json(Windows) 來配置 Daemon。

請在該配置文件中加入(沒有該文件的話,請先建一個):

{
  "registry-mirrors": ["http://hub-mirror.c.163.com"]
}

 

3 Docker常用命令

3.1 鏡像常用命令

1)搜索鏡像

可以在Docker Hub主頁上搜索鏡像,可以通過docker search命令搜索,如:

docker search [OPTIONS] TERM

OPTIONS說明:

  • --automated : 只列出 automated build類型的鏡像;
  • --no-trunc : 顯示完整的鏡像描述;
  • -s : 列出收藏數不小於指定值的鏡像。
[root@localhost hemi]# docker search -s 20 tomcat
INDEX       NAME                                      DESCRIPTION           STARS     OFFICIAL   AUTOMATED
docker.io   docker.io/tomcat                          Apache Tomcat is...   1757      [OK]       
docker.io   docker.io/dordoka/tomcat                  Ubuntu 14.04, Or...   48                   [OK]
docker.io   docker.io/tomee                           Apache TomEE is ...   47        [OK]       
docker.io   docker.io/davidcaste/alpine-tomcat        Apache Tomcat 7/...   24                   [OK]

其中,

STARTS:鏡像倉庫收藏數

AUTOMATED:表示是否是自動構建的鏡像倉庫

2)下載鏡像

docker pull [OPTIONS] NAME[:TAG]

OPTIONS說明:

  • -a :拉取所有 tagged 鏡像 
  • --disable-content-trust :忽略鏡像的校驗,默認開啟

舉個栗子

docker pull java   #從Docker Hub中下載最新版本的Java鏡像
docker pull reg.itmuch.com/java:8    #從指定Registry中下載標簽為8的Java鏡像

3)列出鏡像

docker images [OPTIONS] [REPOSITORY[:TAG]]

OPTIONS說明:  

  • -a :列出本地所有的鏡像(含中間映像層,默認情況下,過濾掉中間映像層);
  • --digests :顯示鏡像的摘要信息
  • -f :顯示滿足條件的鏡像;
  • --format :指定返回值的模板文件;
  • --no-trunc :顯示完整的鏡像信息;
  • -q :只顯示鏡像ID。

舉個栗子:

列出本地鏡像中REPOSITORY為ubuntu的鏡像列表

[hemi@localhost ~]$ docker images ubuntu
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/ubuntu    latest              0458a4468cbc        7 weeks ago         111.7 MB
docker.io/ubuntu    15.10               9b9cb95443b5        20 months ago       137.2 MB

4)刪除本地鏡像

docker rmi [OPTIONS] IMAGE [IMAGE...]

OPTIONS說明:  

  • -f :強制刪除;
  • --no-prune :不移除該鏡像的過程鏡像,默認移除;

3.2 容器常用命令

 1)新建並啟動容器

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

 OPTIONS說明(常用):

  • -d: 后台運行容器,並返回容器ID;
  • --name="nginx-lb": 為容器指定一個名稱;
  • -i:以交互模式運行容器,通常與 -t 同時使用;
  • -t:為容器重新分配一個偽輸入終端,通常與 -i 同時使用;
  • -P: 隨機端口映射;
  • -p: 指定端口映射,有以下四種格式
    • ip:hostPort:containerPort
    • ip::containerPort
    • hostPort:containerPort
    • containerPort
  • --net="bridge": 指定容器的網絡連接類型,支持 bridge/host/none/container:<name|id> 四種類型;

 如:

docker run --name mynginx -d nginx:latest
#使用docker鏡像nginx:latest以后台模式啟動一個容器,並將容器命名為mynginx。

docker run -p 91:80 -v /data:/data -d nginx:latest
#使用鏡像nginx:latest以后台模式啟動一個容器,將容器的80端口映射到主機的91端口,主機的目錄/data映射到容器的/data。

[hemi@localhost ~]$ docker run -it nginx:latest /bin/bash 
root@b8573233d675:
/#
#使用鏡像nginx:latest以交互模式啟動一個容器,在容器內執行
/bin/bash命令。

2)列出容器

docker ps [OPTIONS]

 OPTIONS說明(常用):

  • -a :顯示所有的容器,包括未運行的。
  • -f :根據條件過濾顯示的內容。
  • --format :指定返回值的模板文件。
  • -l :顯示最近創建的容器。
  • -n :列出最近創建的n個容器。
  • --no-trunc :不截斷輸出。
  • -q :靜默模式,只顯示容器編號。
  • -s :顯示總的文件大小。

3)停止容器

docker stop CONTAINER_ID/CONTAIN_NAME

4)強制停止容器

docker kill CONTAINER_ID/CONTAIN_NAME

5)啟動已停止容器

docker start CONTAINER_ID/CONTAIN_NAME

6)重啟容器

docker restart CONTAINER_ID/CONTAIN_NAME

7)進入容器

docker exec -it CONTAINER_ID bash

如:

[hemi@localhost ~]$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                    NAMES
219371844a81        7f94db72116e        "tomcat.sh"         7 seconds ago       Up 7 seconds        8009/tcp, 8080/tcp, 0.0.0.0:91->80/tcp   zen_kalam
[hemi@localhost ~]$ docker exec -it 219371844a81 bash
bash-4.2$ 

8)刪除容器

docker rm [OPTIONS] CONTAINER [CONTAINER...]

 OPTIONS說明(常用):

  • -f :通過SIGKILL信號強制刪除一個運行中的容器
  • -l :移除容器間的網絡連接,而非容器本身
  • -v :-v 刪除與容器關聯的卷

 

更多命令見Docker的官方文檔https://docs.docker.com/edge/engine/reference/commandline/

也可以利用命令行查看,如:

docker rm --help

 

4 入門實戰

此時瀏覽器訪問結果如下表示正常 

再次訪問瀏覽器如下結果,表示修改正常 

 

 但是此時如果重啟容器,則之前的改動將失效。若要保存修改可以提交保存為新鏡像↓

 

此過程還可以用Dockerfile完成

1、首先新建Dockerfile,內容如下:

2、在Dockerfile所在路徑執行以下命令構建鏡像,並運行:

瀏覽器訪問


 

Dockerfile官方文檔https://docs.docker.com/engine/reference/builder/

Dockerfile最佳實踐https://docs.docker.com/develop/develop-images/dockerfile_best-practices/

 

 5 Docker Compose

Docker Compose用來定義和運行多應用容器。使用Docker Compose大致有3個步驟:

  • 使用Dockerfile定義應用程序環境,應標在任何地方重現該環境
  • 在docker-compose.yml文件中定義組成應用程序的服務,以便各個服務在一個隔離的環境中一起運行
  • 運行docker-compose up 命令,啟動並運行整個應用程序

5.1 安裝Compose

①通過以下命令自動下載並安裝適應系統版本的Compose:

curl -L "https://github.com/docker/compose/releases/download/1.10.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

②為安裝腳本添加執行權限:

chmod +x /usr/local/bin/docker-compose

安裝完成。可以使用以下命令測試安裝結果:

ocker-compose --version

5.2 安裝Compose命令補全工具

curl -L https://raw.githubusercontent.com/docker/compose/$(docker-compose version --short)/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose

輸入docker-compose並按下Tab鍵,compose就可以自動補全命令了。

5.3 入門實例

 個人博客實例,含三個層,分別為nginx、ghost app、mysql

1、創建3個目錄

2、進入ghost目錄,創建兩個文件

① Dockerfile

FROM ghost
COPY ./config.production.json /var/lib/ghost/config.production.json
EXPOSE 2368

 

config.production.json  

{
    "url": "http://localhost:2368/",
    "server": {
        "port": 2368,
        "host": "0.0.0.0"
    },
    "database": {
        "client": "mysql",
        "connection": {
            "host": "db",
            "user": "ghost",
            "password": "ghost",
            "database": "ghost",
            "port": 3306,
            "charset": "utf8"
        }
    },
    "mail": {
        "transport": "Direct"
    },
    "logging": {
        "transports": [
            "file",
            "stdout"
        ]
    },
    "process": "systemd",
    "paths": {
        "contentPath": "/var/lib/ghost/content"
    }
}

 

 3、進入nginx目錄,配置

①Dockerfile

FROM docker.io/nginx
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80

②nginx.conf

worker_processes 4;
events {worker_connections 1024;}
http {
    server {
        listen 80;
        location / {
            proxy_pass http://ghost-app:2368;
        }
    }
}

4、配置docker-compose.yml

 在blog目錄下創建docker-compose.yml文件

version: '2'
networks:
  ghost:
services:
  ghost-app:
    build: ghost
    networks:
      - ghost
    depends_on:
      - db
    ports:
      - "2368:2368"
  nginx:
    build: nginx
    networks: 
      - ghost
    depends_on:
      - ghost-app
    ports:
      - "80:80"
  db:
    image: "mysql:5.7.15"
    networks:
      - ghost
    environment:
      MYSQL_ROOT_PASSWORD: mysqlroot
      MYSQL_USER: ghost
      MYSQL_PASSWORD: ghost
    volumes:
      - $PWD/data:/var/lib/mysql
    ports:
      - "3306:3306"

以上即可。隨后在docker-compose.yml所在目錄build鏡像並運行

docker-compost stop         #停止容器   
docker-compose rm            #刪除容器
docker-compose build         #重新建立
docker-compose up -d        #啟動運行

 


 

docker-compose命令-官方文檔https://docs.docker.com/compose/reference/overview/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM