Docker食绿、Docker Compose、Harbor 的使用

Docker 引擎是一種用于構(gòu)建和容器化應(yīng)用程序的開源容器化技術(shù)公罕。它是一個服務(wù)端-客戶端結(jié)構(gòu)的應(yīng)用器紧,主要有以下部分組成:

  1. Docker 守護(hù)進(jìn)程:持久化的進(jìn)程,監(jiān)聽 Docker Engine API 的請求
  2. Docker Engine API:與 Docker 守護(hù)進(jìn)程交互用的的 RESTful API
  3. Docker 客戶端:命令行接口楼眷,通過客戶端將命令發(fā)送給守護(hù)進(jìn)程

Dockerfile 一個文本文檔铲汪,Docker 可以通過讀取 Dockerfile 中定義的指令來自動構(gòu)建鏡像。

Docker Compose 是一個用于定義和運(yùn)行多個容器的 Docker 工具罐柳。Compose 使用 YAML 文件來配置應(yīng)用程序的服務(wù)掌腰。然后,通過單個命令张吉,就可以從配置中創(chuàng)建并啟動所有服務(wù)齿梁。

下面演示所用 Demo 地址:https://github.com/14032/gchat

Dockerfile

Docker 提供了一種構(gòu)建鏡像方式叫 Dockerfile,下面是用來構(gòu)建 gchat 項(xiàng)目鏡像的 Dockerfile 文件:

FROM maven:3-jdk-8-alpine
MAINTAINER "人間春蕩蕩 <人間春蕩蕩@126.com>"

WORKDIR /opt/gchat
ADD gchat.war .
RUN jar -xvf gchat.war

ENV TZ=Asia/Shanghai
EXPOSE 8080

ENTRYPOINT java -cp /opt/gchat org.springframework.boot.loader.WarLauncher
  1. FROM 用來指定鏡像所依賴的基礎(chǔ)鏡像,這里項(xiàng)目需要的是 JDK 環(huán)境
  2. MAINTAINER:作者信息
  3. WORKDIR:指定后續(xù)命令執(zhí)行的目錄勺择,即后續(xù)的命令都將 /opt/gchat 作為當(dāng)前目錄
  4. ADD:復(fù)制文件创南,將當(dāng)前目錄下 gchat.war 包復(fù)制到鏡像 /opt/gchat/ 目錄下
  5. RUN:在容器中要執(zhí)行的 shell 命令
  6. ENV:指定環(huán)境變量,這里指定了時區(qū)
  7. EXPOSE:聲明服務(wù)監(jiān)聽端口(僅僅是聲明省核,并不會主動做端口映射)
  8. ENTRYPOINT:指定鏡像的入口啟動進(jìn)程

Dockerfile 編寫完了稿辙,下面看下如何使用 Dockerfile 文件來生成鏡像。

#  構(gòu)建鏡像命令
docker build -t gchat:1.0-SNAPSHOT .

-t 作用是給鏡像打個標(biāo)簽气忠,起個名字邻储。

末尾 . 代表 Dockerfile 文件在當(dāng)前操作的目錄下,否則可以通過 -f /opt/Dockerfile 參數(shù)來指定文件位置笔刹。

docker build 會加載當(dāng)前目錄下的 Dockerfile 文件芥备,然后按照順序,執(zhí)行文件中定義的命令舌菜。

docker build 執(zhí)行完成后萌壳,通過 docker images 命令查看鏡像列表:

$ docker images
REPOSITORY    TAG             IMAGE ID        CREATED         SIZE
gchat         1.0-SNAPSHOT    d97ec5bc1022    4 months ago    241MB

通過 docker run 來創(chuàng)建運(yùn)行 gchat 容器:

docker run -d --network=host --name gchat \
--env jdbc.type="mysql" \
--env jdbc.username="root" \
--env jdbc.password="root" \
--env jdbc.driver="com.mysql.cj.jdbc.Driver" \
--env jdbc.url="jdbc:mysql://192.168.0.10:3306/gchat?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai" gchat:1.0-SNAPSHOT192

參數(shù) --network 用來指定容器運(yùn)行的網(wǎng)絡(luò)模式,默認(rèn)為 bridge 方式日月。host 則表示主機(jī)網(wǎng)絡(luò)模式袱瓮,共享宿主機(jī)的網(wǎng)絡(luò)棧;若采用默認(rèn)的 bridge 方式爱咬,則需要開啟端口映射 -p 8080:8082 尺借,將容器內(nèi)的 8082 端口映射在宿主機(jī)的 8080 端口供外部訪問。

http://127.0.0.1:8080/gchat

運(yùn)行過程中精拟,可通過 docker logs -f gchat 來查看容器項(xiàng)目日志輸出燎斩。

通過 docker ps 查看運(yùn)行中的容器列表:

$ docker ps
CONTAINER ID  IMAGE                COMMAND                 CREATED     STATUS        PORTS   NAMES
12483291aa72  gchat:1.0-SNAPSHOT   "/bin/sh -c 'java -c…"  2 minutes   Up a minute           gchat

查看詳細(xì)信息使用 docker inspect 命令:

# 查看 gchat 容器信息
docker inspect gchat

# 查看 gchat 鏡像的信息:
docker image inspect gchat:1.0-SNAPSHOT

還有一種生成鏡像的方式是:docker commit

這個命令可以把一個正在運(yùn)行的容器蜂绎,直接提交為一個鏡像栅表。

例如在內(nèi)網(wǎng)環(huán)境安裝 Jenkins ,不能訪問互聯(lián)網(wǎng)师枣,這個時候就可以先在本地運(yùn)行 Jenkins 容器:

docker run -d --name jenkins -p 8084:8080 jenkins/jenkins:lts

運(yùn)行成功后怪瓶,訪問 http://127.0.0.1:8084/jenkins ,把需要的一些插件全部安裝后践美,對正在運(yùn)行的容器執(zhí)行 docker commit 操作洗贰,這樣在容器之上的所有操作都會保存到新的鏡像里。

# 將運(yùn)行中的容器 56b5168a7ae2 提交為鏡像 
docker commit 56b5168a7ae2 jenkins:self-v3

之后陨倡,可通過 docker save 命令導(dǎo)出鏡像敛滋,再通過 docker load 命令將鏡像加載至內(nèi)網(wǎng)中。

# 導(dǎo)出
docker save -o jenkins-lts-v3.tar jenkins:self-v3
# 導(dǎo)入
docker load -i jenkins-lts-v3.tar jenkins:self-v3

當(dāng)然還可以通過 Volume 數(shù)據(jù)卷的功能玫膀,將宿主機(jī)目錄掛載到 Jenkins 所在容器內(nèi)的安裝目錄上矛缨,這樣所有的有關(guān) Jenkins 文件增刪改都發(fā)生在宿主機(jī)上。

# 將 /opt/jenkins 掛載至容器內(nèi) jenkins 的安裝目錄
-v /opt/jenkins:/home/jenkins

如果想在運(yùn)行中的容器中執(zhí)行 shell 命令帖旨,使用 docker exec 命令:

docker exec -it gchat /bin/sh

命令執(zhí)行后會進(jìn)入容器的默認(rèn)工作目錄箕昭,如果在 Dockerfile 中指定了工作目錄 WORKDIR,則會進(jìn)入 Dokcerfile 指定的目錄解阅,例如執(zhí)行 ls 默認(rèn)顯示的就是 /opt/gchat 下的文件落竹。

$ docker exec -it gchat ls
META-INF   WEB-INF    gchat.war  org

查看設(shè)置的環(huán)境變量 env:

$ docker exec -it gchat env

# Dockerfile 鏡像中指定
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/jvm/java-1.8-openjdk/jre/bin:/usr/lib/jvm/java-1.8-openjdk/bin
HOSTNAME=f3b50c9fcb00
LANG=C.UTF-8
JAVA_HOME=/usr/lib/jvm/java-1.8-openjdk
JAVA_VERSION=8u212
JAVA_ALPINE_VERSION=8.212.04-r0
MAVEN_HOME=/usr/share/maven
MAVEN_CONFIG=/root/.m2
JAVA_OPTS=-Xms1024m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m
HOME=/root

# 創(chuàng)建容器時指定
jdbc.type=mysql
jdbc.username=root
jdbc.password=root
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://mysql:3306/gchat?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
TZ=Asia/Shanghai

執(zhí)行 uname -a,查看 Linux 內(nèi)核版本:

# 容器內(nèi)執(zhí)行
$ docker exec -it gchat /bin/sh
/opt/gchat # uname -a
Linux king-ubuntu 4.15.0-108-generic #109-Ubuntu SMP Fri Jun 19 11:33:10 UTC 2020 x86_64 Linux
/opt/gchat # exit
# 宿主機(jī)
$ uname -a
Linux king-ubuntu 4.15.0-108-generic #109-Ubuntu SMP Fri Jun 19 11:33:10 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

首先要明確的是货抄,容器與宿主機(jī)共享操作系統(tǒng)內(nèi)核述召,也就是說容器和鏡像是沒有內(nèi)核的,只有文件系統(tǒng)蟹地。我們有些服務(wù)器是華為 TaiShan积暖,基于鯤鵬處理器 ARM 架構(gòu)的 Linux 系統(tǒng),在剛開始使用 Docker 的時候怪与,嘗試在其中啟動基于 X86 架構(gòu)構(gòu)建的鏡像夺刑,很顯然失敗了。

下面是官方文檔中 Docker 的特性說明分别,其中約束和隔離涉及到 Linux 的 Namespace 和 Cgroups 特性遍愿,大家可自行 Google 了解。

靈活:即使是最復(fù)雜的應(yīng)用程序也可以被容器化耘斩。
輕量級:容器利用并共享主機(jī)內(nèi)核沼填,使它們在系統(tǒng)資源方面比虛擬機(jī)效率更高。
可移植:您可以在本地構(gòu)建括授、部署到云中坞笙,并在任何地方運(yùn)行。
松散耦合:容器是高度自給自足和封裝的荚虚,允許您替換或升級一個容器薛夜,而不會破壞其他容器。
可擴(kuò)展:您可以增加和自動分發(fā)跨數(shù)據(jù)中心的容器副本曲管。
安全:容器對進(jìn)程進(jìn)行約束和隔離却邓,而不需要用戶進(jìn)行任何配置。

容器只是操作系統(tǒng)中的一個進(jìn)程:

從根本上說院水,容器只不過是一個正在運(yùn)行的進(jìn)程腊徙,為了保持它與主機(jī)和其他容器的隔離,對它應(yīng)用了一些附加的封裝特性檬某。容器隔離最重要的是每個容器與自己的私有文件系統(tǒng)交互撬腾;這個文件系統(tǒng)由 Docker 鏡像提供。鏡像包括運(yùn)行應(yīng)用程序所需的一切代碼或二進(jìn)制恢恼、運(yùn)行時民傻、依賴項(xiàng)和任何其他所需的文件系統(tǒng)對象。

# 查看進(jìn)程號
$ docker top gchat
UID     PID      PPID    C    STIME    TTY    TIME           CMD
root    4038     4014    6    13:57     ?     00:00:14       java -cp ...

Harbor

Harbor 是構(gòu)建企業(yè)級私有 Docker 鏡像倉庫的開源解決方案,就像 Nexus 是 Maven 的 JAR 倉庫管理器一樣漓踢。

Harbor 使用 Docker 方式來安裝啟動牵署,并且通過 Docker Compose 工具來管理,所以請先確保 Docker 環(huán)境和 Docker Compose 工具已經(jīng)成功安裝喧半。

Harbor 離線安裝包 harbor-offline-installer-v1.9.4.tgz 下載地址:

https://github.com/goharbor/harbor/releases

將安裝包解壓奴迅,Harbor 的配置文件 harbor.yml ,包括域名挺据、端口號取具、初始密碼等配置:

# Configuration file of Harbor
hostname: 192.168.0.110
# http related config
http:
  port: 8089
harbor_admin_password: Harbor12345
......

在解壓后的文件夾下執(zhí)行 ./install.sh 命令進(jìn)行安裝,輸出如下:

[Step 0]: checking installation environment ...
Note: docker version: 19.03.5
Note: docker-compose version: 1.25.3

[Step 1]: loading Harbor images ...
Loaded image: goharbor/harbor-core:v1.9.4
Loaded image: goharbor/clair-photon:v2.1.0-v1.9.4
... 略
[Step 2]: preparing environment ...
prepare base dir is set to /usr/local/harbor
Clearing the configuration file: /config/db/env
... 略
[Step 3]: starting Harbor ...
Creating harbor-log ... done
Creating registry      ... done
... 略
? ----Harbor has been installed and started successfully.----

安裝成功后扁耐,文件夾下會出現(xiàn)一個 docker-compose.yml 文件暇检,YML 文件中定義了 Harbor 工具所需要創(chuàng)建的容器以及其它配置⊥癯疲可以通過 Docker Compose 命令來啟動块仆、停止、卸載 Harbor 服務(wù)酿矢,關(guān)于 Docker Compose 的使用下面會介紹榨乎。

  • 創(chuàng)建 Harbor 服務(wù)所需容器并且啟動

    docker-compose -f /usr/local/harbor/docker-compose.yml -p harbor up -d

  • 停止并刪除 Harbor 服務(wù)所需容器

    docker-compose -f /usr/local/harbor/docker-compose.yml down

  • 啟動、停止瘫筐、重啟 Harbor 服務(wù)

    docker-compose -f /usr/local/harbor/docker-compose.yml start/stop/restart

安裝成功后蜜暑,執(zhí)行下 docker images 命令,查看此時的鏡像列表策肝,輸出如下肛捍,這些鏡像皆是在執(zhí)行 ./install.sh 命令時構(gòu)建的,即上面輸出中的 [Step 1]: loading Harbor images

goharbor/chartmuseum-photon    v0.9.0-v1.9.4    7fd23c6f1f36    127MB
goharbor/harbor-migrator       v1.9.4           899a03b70174    363MB
goharbor/redis-photon          v1.9.4           48c941077683    113MB
goharbor/clair-photon          v2.1.0-v1.9.4    ea69a6daa928    170MB
goharbor/notary-server-photon  v0.6.1-v1.9.4    3a02116cf089    143MB
goharbor/notary-signer-photon  v0.6.1-v1.9.4    289af497dbf0    140MB
goharbor/harbor-registryctl    v1.9.4           7259026fb1bb    103MB
goharbor/nginx-photon          v1.9.4           364c17f09df9    44MB
goharbor/harbor-log            v1.9.4           e0188c234aa2    82.3MB
goharbor/harbor-jobservice     v1.9.4           207acbcff6f5    141MB
goharbor/harbor-core           v1.9.4           a805deab5833    156MB
goharbor/harbor-portal         v1.9.4           cfd272546394    51.4MB
goharbor/harbor-db             v1.9.4           265c8c83954e    150MB
goharbor/prepare               v1.9.4           b2cded69458d    151MB

再執(zhí)行一下 docker ps 命令之众,查看此時有哪些運(yùn)行中的容器拙毫,輸出如下,這些就是 Harbor 服務(wù)所需要的容器棺禾,它們的創(chuàng)建和啟動是在 ./install.sh 執(zhí)行的第三步完成的 [Step 3]: starting Harbor ...

CONTAINER ID   IMAGE                               NAMES
751a81c67e99   goharbor/nginx-photon:v1.9.4        nginx
7cb50d0224d4   goharbor/harbor-jobservice:v1.9.4   harbor-jobservice
c2751b9f1d81   goharbor/harbor-core:v1.9.4         harbor-core
2344cd81a05a   goharbor/redis-photon:v1.9.4        redis
89a8695d234a   goharbor/harbor-registryctl:v1.9.4  registryctl
f9c564f44ef2   goharbor/harbor-portal:v1.9.4       harbor-portal
c4661ab61769   goharbor/harbor-db:v1.9.4           harbor-db
86984dbff640   goharbor/registry-photon:v1.9.4     registry
3c36fe8023ef   goharbor/harbor-log:v1.9.4          harbor-log

瀏覽器訪問 Harbor 控制臺缀蹄,賬號:admin 默認(rèn)密碼:Harbor12345

Harbor Admin

Docker Maven Plugin

上面通過手動執(zhí)行 docker build 命令已經(jīng)成功構(gòu)建了鏡像,這里再看下如何在項(xiàng)目通過 Maven 插件來自動構(gòu)建鏡像并且發(fā)布至倉庫 Harbor 中膘婶。

筆者是在 Windows 的 IDEA 中構(gòu)建缺前,Docker 是通過虛擬機(jī)安裝的,所以首先需要配置 Docker 允許遠(yuǎn)程連接悬襟。

編輯 vim /lib/systemd/system/docker.service 衅码,將 ExecStart 追加參數(shù) -H tcp://0.0.0.0:2375

ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375

保存后,重啟:

systemctl daemon-reload
systemctl restart docker

通過瀏覽器訪問 http://192.168.0.110:2375/info 成功即可脊岳。

在 IDEA 中添加 Docker 配置:

在 IDEA 中查看 Docker 容器逝段、鏡像信息:

docker maven 插件配置:具體參看 Spring Boot Demo 項(xiàng)目

<plugin>
    <groupId>com.spotify</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <version>1.2.2</version>
    <configuration>
        <serverId>docker-harbor</serverId>
        <dockerHost>http://192.168.0.110:2375</dockerHost>
        <registryUrl>192.168.0.110:8089</registryUrl>
        <imageName>192.168.0.110:8089/base/${project.build.finalName}:${project.version}</imageName>
        <dockerDirectory>${project.basedir}/bin/docker</dockerDirectory>
        <resources>
            <resource>
                <targetPath>/</targetPath>
                <directory>${project.build.directory}</directory>
                <include>${project.build.finalName}.war</include>
            </resource>
        </resources>
        <imageTags>
            <imageTag>${project.version}</imageTag>
        </imageTags>
        <forceTags>true</forceTags>
        <pushImage>true</pushImage>
    </configuration>
</plugin>
  1. dockerHost 標(biāo)簽可以指定 Docker 服務(wù)遠(yuǎn)程地址
  2. registryUrl 指定倉庫地址垛玻,這里用的是自己搭建的 Harbor 鏡像倉庫
  3. imageName 指定鏡像名稱
  4. dockerDirectory 用來指定 Dockerfile 文件的位置
  5. imageTags 即指定鏡像版本號
  6. pushImage 表示是否將鏡像推送到指定的倉庫中,為 false 時奶躯,構(gòu)建成功后不推送倉庫

構(gòu)建前首先在 Maven 配置中添加 Harbor 用戶名密碼和 plugin 配置:

<server>  
  <id>docker-harbor</id>  
  <username>admin</username>
  <password>Harbor12345</password>
</server> 
<pluginGroups>
    <pluginGroup>com.spotify</pluginGroup>
</pluginGroups>

下面執(zhí)行命令進(jìn)行構(gòu)建并上傳至 Harbot:

mvn clean package docker:build -Dmaven.test.skip=true -Pdocker

輸出如下:

[INFO] Building image 192.168.0.110:8089/base/gchat:1.0
Step 1/9 : FROM maven:3-jdk-8-alpine
 ---> 7445f83cd169
Step 2/9 : MAINTAINER "人間春蕩蕩 <人間春蕩蕩@126.com>"
 ---> 6ec6024e4273
Step 3/9 : WORKDIR /opt/gchat
 ---> f48609ccaa2d
Step 4/9 : ADD gchat.war .
 ---> 7335b0f3485c
Step 5/9 : RUN jar -xvf gchat.war
... 略
Successfully built 6ce252273598
Successfully tagged 192.168.0.110:8089/base/gchat:1.0

構(gòu)建成功后帚桩,登錄 Harbor,http://192.168.0.110/harbor 查看鏡像信息巫糙。

局域網(wǎng)內(nèi)可通過 docker pull 拉取 Harbor 上的鏡像:

docker pull 192.168.0.110:8089/base/gchat:1.0

docker push 默認(rèn)推送地址是 Docker 官方倉庫 https://hub.docker.com/ 朗儒,你需要先注冊一個 Docker Hub 賬號颊乘,然后用 docker login 命令登錄后即可執(zhí)行 docker push 推送鏡像参淹。 如要將本地鏡像推送至私人搭建的倉庫 Harbor,登錄時要指定鏡像倉庫地址:

docker login 192.168.0.110:8089

Docker Compose

編排工具就是來管理 Docker 容器的定義乏悄、配置和創(chuàng)建浙值,筆者在 docker-compose.yml 文件中定義了三個服務(wù),mysql檩小、nginx开呐、gchat,并且指定了它們之間的關(guān)聯(lián)關(guān)系规求。

version: '3.7'
services:
  mysql:
    image: mysql:latest
    container_name: mysql
    restart: always
    ports:
      - "3407:3306"
    volumes:
      - ./mysql/data/:/var/lib/mysql
      - ./mysql/my.cnf:/etc/mysql/my.cnf
      - ./mysql/sec:/var/lib/mysql-files
    environment:
      MYSQL_ROOT_PASSWORD: "root"
  gchat:
    image: com.demo/gchat:1.0-SNAPSHOT
    container_name: gchat
    restart: always
    ports:
      - "8087:8082"
    depends_on:
      - mysql
    environment:
      jdbc.type: "mysql"
      jdbc.username: "root"
      jdbc.password: "root"
      jdbc.driver: "com.mysql.cj.jdbc.Driver"
      jdbc.url: "jdbc:mysql://mysql:3306/gchat?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai"
  nginx:
    image: nginx:1.17.8
    container_name: nginx
    restart: always
    depends_on:
      - gchat
    volumes:
      - ./nginx/conf/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/html:/usr/share/nginx/html
      - ./nginx/logs:/var/log/nginx
    ports:
      - 80:80
    environment:
      - TZ=Asia/Shanghai

這里 mysql 容器的配置文件和數(shù)據(jù)被掛載到宿主機(jī)上筐付,nginx 的配置文件也被掛載到了宿主機(jī)上,這樣即使刪除容器的話阻肿,數(shù)據(jù)也不會丟失瓦戚;修改配置文件可直接在宿主機(jī)上進(jìn)行編輯,無需通過 docker exec 命令進(jìn)入容器內(nèi)修改(或者是通過 docker cp 來 copy 文件至宿主機(jī)內(nèi))丛塌。

執(zhí)行 docker-compose -p gchat up -d 命令來創(chuàng)建和啟動容器较解,此命令默認(rèn)會在當(dāng)前目錄下查找 docker-compose.yml 文件,也可手動指定文件位置 -f /opt/gchat/docker-compose.yml 赴邻,先看下輸出信息:

$ docker-compose -p gchat up -d
Creating network "gchat_default" with the default driver
Creating mysql ... done
Creating gchat ... done
Creating nginx ... done

默認(rèn)的網(wǎng)絡(luò)模式為 network_mode: bridge 印衔。

首先會創(chuàng)建一個名稱為 gc_default 的網(wǎng)絡(luò),然后根據(jù)配置 依次創(chuàng)建容器 mysql姥敛、 gchat奸焙、nginx,并且以其容器名稱加入 gc_default 網(wǎng)絡(luò)中彤敛。這樣 Docker Compose 管理下的容器之間的相互訪問即可通過容器名稱加容器端口的方式与帆。

也可以通過 docker network create 命令先創(chuàng)建網(wǎng)絡(luò),然后在 yml 中進(jìn)行配置臊泌。

docker network create -d bridge self-network
networks:
  default:
    external:
      name: self-network

通過 docker network ls 查看當(dāng)前的網(wǎng)絡(luò):

/opt/gchat$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
10b2aaa3c026        bridge              bridge              local
c5555d99ae9d        gchat_default       bridge              local
b6a883741497        host                host                local
0f969b2af1da        none                null                local

再查看下剛剛創(chuàng)建的網(wǎng)絡(luò) gchat_default 的具體信息:docker network inspect gchat_default

$ docker network inspect gchat_default
......
"Name": "gchat_default",
"Driver": "bridge",
"IPAM": {
    "Driver": "default",
    "Config": [
        {
            "Subnet": "172.27.0.0/16",
            "Gateway": "172.27.0.1"
        }
    ]
},
"Containers": {
    "4e2eacd13160d9d5a98da97e61e5686418d6dd4f8592fef5f64c0ee622307d82": {
        "Name": "gchat",
        "MacAddress": "02:42:ac:1b:00:03",
        "IPv4Address": "172.27.0.3/16"
    },
    "6ff30a833674c4bf2629329d7a63e8b2070c8ea738b3e38c48ae5535addc4d43": {
        "Name": "nginx",
        "MacAddress": "02:42:ac:1b:00:04",
        "IPv4Address": "172.27.0.4/16"
    },
    "d530fef73b38301a9b94421ec213c274129b01f494138786ab4175a8d65f4037": {
        "Name": "mysql",
        "MacAddress": "02:42:ac:1b:00:02",
        "IPv4Address": "172.27.0.2/16"
    }
},
......

信息很清晰鲤桥,默認(rèn)的網(wǎng)絡(luò)驅(qū)動是:bridge,網(wǎng)絡(luò)名稱為:gchat_default渠概,網(wǎng)段為 172.27.0.0/16茶凳,給每一個容器都分配了一個 IP嫂拴。

在用戶自己定義的 Docker 網(wǎng)絡(luò)中,容器名稱的 DNS 解析會自動發(fā)生贮喧,Docker 內(nèi)嵌的 DNS 服務(wù)維護(hù)容器名稱及其 IP 地址筒狠,如容器正在使用定義的 Docker 網(wǎng)絡(luò),無需執(zhí)行任何操作箱沦,它們可以使用主機(jī)名自動找到對方辩恼。如下:ping 其它的容器名稱

$ docker exec -it gchat ping mysql
PING mysql (172.27.0.2): 56 data bytes
64 bytes from 172.27.0.2: seq=0 ttl=64 time=0.050 ms
64 bytes from 172.27.0.2: seq=1 ttl=64 time=0.102 ms

$ docker exec -it gchat ping nginx
PING nginx (172.27.0.4): 56 data bytes
64 bytes from 172.27.0.4: seq=0 ttl=64 time=0.045 ms
64 bytes from 172.27.0.4: seq=1 ttl=64 time=0.060 ms

在 Docker 中,容器的主機(jī)名默認(rèn)為容器的 ID谓形,也可以通過 --hostname 參數(shù)來指定灶伊,通過 docker exec 查看容器的 hosts 文件:

$ docker exec -it mysql cat /etc/hosts
172.27.0.2  d530fef73b38

查看正在運(yùn)行的容器:

$ docker ps
CONTAINER ID   IMAGE        COMMAND                  STATUS          PORTS                      NAMES
6ff30a833674   nginx:1.17.8  "nginx -g "             Up 19 minutes   80->80/tcp   nginx
4e2eacd13160   gchat:1.0     "/bin/sh -c 'java -c…"  Up 19 minutes   8080/tcp, 8087->8082/tcp   gchat
d530fef73b38   mysql:latest  "docker-entrypoint.s…"  Up 19 minutes   33060/tcp, 3407->3306/tcp  mysql

對于容器內(nèi)的 DNS 配置,如果宿主機(jī)的 /etc/resolv.conf 內(nèi)容發(fā)生改變寒跳,Docker 進(jìn)程會監(jiān)聽到這些改變聘萨,并將變化同步至容器的 /etc/resolv.conf 。但前提是童太,只有在容器停止時米辐,才會同步這些配置的更改。因此书释,要想使宿主機(jī)上配置的 DNS 生效翘贮,就需要停止容器后重新啟動。

執(zhí)行 docker inspect gchat 查看容器如下信息:

# system
"ResolvConfPath": "/var/lib/docker/containers/de88cfcfcb410dba67b4bcb7da/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/de88cfcfcb410dba67b4bcb7da/hostname",
"HostsPath": "/var/lib/docker/containers/de88cfcfcb410dba67b4bcb7da/hosts",

網(wǎng)絡(luò)信息:

"Networks": {
    "gchat_default": {
        "Aliases": [
            "gchat",
            "de88cfcfcb41"
        ],
        "NetworkID": "7a140855e53ec5d86af3733dc7b0ef10ed95437811623eb1d00f6185b7cfcaf8",
        "Gateway": "172.30.0.1",
        "IPAddress": "172.30.0.3",
        "MacAddress": "02:42:ac:1e:00:03",
    }
}

數(shù)據(jù)卷信息:

# Volumn
"Mounts": [
    {
        "Type": "bind",
        "Source": "/opt/gchat/mysql/data",
        "Destination": "/var/lib/mysql",
        "Mode": "rw", "RW": true,
        "Propagation": "rprivate"
    },
    {
        "Type": "bind",
        "Source": "/opt/gchat/mysql/my.cnf",
        "Destination": "/etc/mysql/my.cnf",
        "Mode": "rw", "RW": true,
        "Propagation": "rprivate"
    }
]

查看日志的話爆惧,可通過 docker logs -f gchat狸页,也可通過 docker-compose logs -f gchat 來查看。

如果想要強(qiáng)制重建某個容器检激,可使用 --force-recreate 參數(shù):

docker-compose up -d --force-recreate mysql

否則只會在容器配置有更改時才會重建容器肴捉,容器之間根據(jù) depends_on 參數(shù)設(shè)置了依賴關(guān)系,代表了其創(chuàng)建啟動的順序叔收。重建某個容器時齿穗,會先重建其依賴的容器,例如重建 gchat 容器時:

$ docker-compose up -d --force-recreate gchat
Recreating mysql ... done
Recreating gchat ... done

停止并刪除所有容器命令:

docker-compose down

刪除某個容器饺律,默認(rèn)只能刪除已停止的容器窃页,-f 強(qiáng)制刪除:

docker rm -f nginx

磁盤空間使用分析:docker system df

空間清理 docker system prune,此命令會刪除:

  1. 所有已停止的容器
  2. 所有不被任何容器使用的 network
  3. 所有懸空鏡像复濒,即未被任何容器引用的鏡像

這里要注意區(qū)分主機(jī)端口和容器端口脖卖,例如對于上面定義的 mysql 容器,3407 是主機(jī)端口巧颈,3306 是容器端口畦木,網(wǎng)絡(luò)化的容器服務(wù)之間的通信使用容器端口,例如 gchat 連接 mysql 數(shù)據(jù)庫使用的是 mysql:3306砸泛;而對于外部網(wǎng)絡(luò)訪問則需要使用主機(jī)端口十籍,例如在其他電腦中通過 Navicat 連接 mysql 則需要使用 3407 端口蛆封。

此外,docker 也提供了一些查看容器資源統(tǒng)計信息的命令勾栗。

通過 docker stats 查看容器 cpu惨篱、mem 使用情況, MEM USAGE / LIMIT 容器使用的總內(nèi)存和允許使用的總內(nèi)存围俘,未做限制時砸讳,允許使用的量為宿主機(jī)總內(nèi)存。

$ docker stats
CONTAINER ID  NAME    CPU %    MEM USAGE / LIMIT     MEM %   NET I/O          BLOCK I/O        PIDS
93a546af2006  nginx   0.00%    108.5MiB / 4.837GiB   2.19%   4.18kB / 0B      4.76MB / 0B      5
f3b50c9fcb00  gchat   1.80%    437.3MiB / 4.837GiB   8.83%   27kB / 21.7kB    60.3MB / 0B      32
64090ff0d7b0  mysql   0.46%    395MiB / 4.837GiB     7.98%   28.8kB / 20.3kB  72.1MB / 18.8MB  40

查看容器在宿主機(jī)中的進(jìn)程號 docker top [containerId or Name]:

$ docker top f3b50c9fcb00
UID      PID    PPID   C   STIME   TTY    TIME       CMD
root     4001   3975   6   15:21    ?     00:00:12   java -cp /opt/gchat -Xms1024m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m org.springframework.boot.loader.WarLauncher

下面對 gchat 容器的 cpu界牡、memory 資源進(jìn)行限制簿寂,不同版本寫法略有差別,具體參看官方說明:

https://docs.docker.com/compose/compose-file/#resources

deploy:
  resources:
    limits:
      cpus: "0.20"
      memory: 2G  

添加如上資源限制標(biāo)簽后欢揖,這時通過 docker-compose up -d --force-recreate gchat 重建容器時陶耍,會有如下提示,設(shè)置的資源限制 deploy 屬性被忽略她混,未起作用。

WARNING: Some services (gchat ) use the ‘deploy’ key, which will be ignored. 
Compose does not support ‘deploy’ configuration - use docker stack deploy to deploy to a swarm.

原因是由于做了資源限制泊碑, 并且沒有使用 swarm坤按,所以要加上 --compatibility 參數(shù),它會將 version: 3.x 版本設(shè)置資源限制的方法轉(zhuǎn)換回 version: 2.x 兼容的屬性馒过。

docker-compose --compatibility up -d --force-recreate gchat

# 參數(shù)含義
--compatibility If set, Compose will attempt to convert keys in v3 files to their non-Swarm equivalent

可以通過運(yùn)行 docker-compose --compatibility config 來驗(yàn)證配置臭脓,會看到資源限制屬性被翻譯成 cpus 和 mem_limit。

$ docker-compose --compatibility config
......
services:
  gchat:
    container_name: gchat
    cpus: 0.2
    mem_limit: 2G
    depends_on:
      mysql:
        condition: service_started
  ......
version: '2.3'

Docker Compose 配置中除了指定鏡像名稱外腹忽,還可以指定 Dockerfile 文件来累,啟動時會先根據(jù) yml 中 Dockerfile 的配置來創(chuàng)建鏡像,詳情參看:

https://docs.docker.com/compose/compose-file/#build

~ END ~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載窘奏,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者嘹锁。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市着裹,隨后出現(xiàn)的幾起案子领猾,更是在濱河造成了極大的恐慌,老刑警劉巖骇扇,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件摔竿,死亡現(xiàn)場離奇詭異,居然都是意外死亡少孝,警方通過查閱死者的電腦和手機(jī)继低,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來稍走,“玉大人袁翁,你說我怎么就攤上這事冷溃。” “怎么了梦裂?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵似枕,是天一觀的道長。 經(jīng)常有香客問我年柠,道長凿歼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任冗恨,我火速辦了婚禮答憔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘掀抹。我一直安慰自己虐拓,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布傲武。 她就那樣靜靜地躺著蓉驹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪揪利。 梳的紋絲不亂的頭發(fā)上态兴,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天,我揣著相機(jī)與錄音疟位,去河邊找鬼瞻润。 笑死,一個胖子當(dāng)著我的面吹牛甜刻,可吹牛的內(nèi)容都是我干的绍撞。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼得院,長吁一口氣:“原來是場噩夢啊……” “哼俐银!你這毒婦竟也來了刃榨?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎撩鹿,沒想到半個月后瓜喇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體纷纫,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡娩践,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了丧荐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缆瓣。...
    茶點(diǎn)故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖虹统,靈堂內(nèi)的尸體忽然破棺而出弓坞,到底是詐尸還是另有隱情隧甚,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布渡冻,位于F島的核電站戚扳,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏族吻。R本人自食惡果不足惜帽借,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望超歌。 院中可真熱鬧砍艾,春花似錦、人聲如沸巍举。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽懊悯。三九已至蜓谋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間定枷,已是汗流浹背孤澎。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留欠窒,地道東北人。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓退子,卻偏偏與公主長得像岖妄,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子寂祥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評論 2 348

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