實用的Docker入門

1 Docker概述

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

理解其中幾個概念:mysql

  • 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 軟件源裏,安裝命令以下:linux

yum -y install docker

啓動docker後臺服務:nginx

service docker start

驗證是否安裝成功:git

[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/github

 

鏡像加速sql

鑑於國內網絡問題,後續拉取 Docker 鏡像十分緩慢,咱們能夠須要配置加速器來解決,我使用的是網易的鏡像地址:http://hub-mirror.c.163.com。docker

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

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

{
  "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完成

一、首先新建Dockerfile,內容以下:

二、在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

一、建立3個目錄

二、進入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"
    }
}

 

 三、進入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;
        }
    }
}

四、配置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/

相關文章
相關標籤/搜索