Docker使用詳解(從入門到進階)

主題:Docker使用詳解(從入門到進階)


目錄:


一、Docker安裝(CentOS 7)

1.如果機器上有docker,那麼首先移除前版本的docker

sudo yum remove docker \
              docker-client \
              docker-client-latest \
              docker-common \
              docker-latest \
              docker-latest-logrotate \
              docker-logrotate \
              docker-engine

2.接着安裝docker所必須的yum插件

sudo yum install -y yum-utils

3.接着配置我們的鏡像倉庫,這裏我們選擇阿里雲倉庫,這樣子速度會比較快

sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 

4. 接着我們就可以下載我們最新版本的docker了

sudo yum install docker-ce docker-ce-cli containerd.io

5. 接着我們運行我們的docker,然後查看版本號。

sudo systemctl start docker
$ docker version
# 表示我們安裝成功了

Client: Docker Engine - Community
 Version:           19.03.11
 API version:       1.40
 Go version:        go1.13.10
 Git commit:        42e35e61f3
 Built:             Mon Jun  1 09:13:48 2020
 OS/Arch:           linux/amd64
 Experimental:      false

6. 最後運行我們的可以接着在進行我們第一個鏡像的拖入運行測試

sudo docker run hello-world
# 首先docker發現我們沒有 hello-world 的鏡像

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Already exists 
Digest: sha256:d58e752213a51785838f9eed2b7a498ffa1cb3aa7f946dda11af39286c3db9a9
Status: Downloaded newer image for hello-world:latest

# 接着docker去中央倉庫尋找目標進行並且進行下載

Hello from Docker!
This message shows that your installation appears to be working correctly.

7. 最後如果有疑惑的話,可以直接去官網查看安裝教程。下面是CentOS下載教程的鏈接,不過是外網,訪問起來可能有點慢。


二、Docker 基礎命令

1. 查看幫助命令

docker pull --help
# 基本的命令使用格式,參數會在下面描述
Usage:  docker pull [OPTIONS] NAME[:TAG|@DIGEST]

# 表示這個命令可以拉取一個進行或者倉庫從docker的中央倉庫
Pull an image or a repository from a registry

# 下面是一些命令行參數的描述
Options:
  -a, --all-tags                Download all tagged images in the repository 
      --disable-content-trust   Skip image verification (default true)
      --platform string         Set platform if server is multi-platform capable
  -q, --quiet                   Suppress verbose output

2. 如果需要詳細的解釋和Demo,可以直接去Docker官網查看,就是速度會比較慢


三、Docker 鏡像查看

1. 查看本地主機上的鏡像

1.1 列出所有鏡像

docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              bf756fb1ae65        5 months ago        13.3kB

1.2 只顯示鏡像的id

docker images -q 
bf756fb1ae65

四、Docker搜索鏡像

1. 首先我們先到官網進行一波搜索,搜索我們需要的mysql

1.1 這裏我們找到比較常用的 mysql 5.7

在這裏插入圖片描述

2. 我們使用Docker進行搜索

2.1 不進行過濾直接搜索全部

docker search mysql

2.1 進行過濾搜索,這裏根據STARS數量進行過濾,篩選數量 > 3000 的目標。

docker search mysql --filter=STARS=3000
NAME                DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
mysql               MySQL is a widely used, open-source relation…   9604                [OK]                
mariadb             MariaDB is a community-developed fork of MyS…   3490                [OK]            

五、Docker下載鏡像

1. 根據 四 中我們的搜索鏡像命令,我麼選擇我們要拉取的鏡像的版本進行拉取

1.1 這個表示我們拉取最新的mysql版本

docker pull mysql

1.2 接下來我們進行有版本選擇的mysql拉取

docker pull mysql:5.7

1.3 這裏額外做一點補充,來看看docker的強大之處。注意這裏的上面的Pull complete和下面的Already exists部分,我們可以觀察到前面的UUID是相同的。說明Docker可以直接複用之前拉好的鏡像的相同的部分,極大的減少了空間的浪費。

root@10.200.25.224[23:12:47]:~
$ docker pull mysql
Using default tag: latest
latest: Pulling from library/mysq

# 下面這些部分會被複用
8559a31e96f4: Pull complete 
d51ce1c2e575: Pull complete 
c2344adc4858: Pull complete 
c75914a65ca2: Pull complete 
1ae8042bdd09: Pull complete 
Digest: sha256:8b7b328a7ff6de46ef96bcf83af048cb00a1c86282bfca0cb119c84568b4caf6
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest
root@10.200.25.224[23:14:16]:~
$ docker pull mysql:5.7
5.7: Pulling from library/mysql

# 新拉取的鏡像會和之前的鏡像進行關聯,如果之前鏡像有公用的部分,那麼就不會進行下載
8559a31e96f4: Already exists 
d51ce1c2e575: Already exists 
c2344adc4858: Already exists 
d85174a87144: Pull complete 
a4ad33703fa8: Pull complete 
f7a5433ce20d: Pull complete 
Digest: sha256:32f9d9a069f7a735e28fd44ea944d53c61f990ba71460c5c183e610854ca4854

六、Docker刪除鏡像

1. 我們可以根據id刪除鏡像

1.1 首先查出我們的有哪些鏡像,主要是獲取目標鏡像的id

docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mysql               5.7                 9cfcce23593a        32 hours ago        448MB
mysql               latest              be0dbf01a0f3        32 hours ago        541MB
hello-world         latest              bf756fb1ae65        5 months ago        13.3kB

1.2 接着我們進行目標鏡像的刪除,可以一次性指定多個id。這裏我們直接刪除兩個mysql。

docker rmi -f be0dbf01a0f3 bf756fb1ae65

# 刪除mysql鏡像
Untagged: mysql:latest
Untagged: mysql@sha256:8b7b328a7ff6de46ef96bcf83af048cb00a1c86282bfca0cb119c84568b4caf6
Deleted: sha256:be0dbf01a0f3f46fc8c88b67696e74e7005c3e16d9071032fa0cd89773771576
Deleted: sha256:086d66e8d1cb0d52e9337eabb11fb9b95960e2e1628d90100c62ea5e8bf72306
..

# 刪除hello-world鏡像
Untagged: hello-world:latest
Untagged: hello-world@sha256:d58e752213a51785838f9eed2b7a498ffa1cb3aa7f946dda11af39286c3db9a9
Deleted: sha256:bf756fb1ae65adf866bd8c456593cd24beb6a0a061dedf42b26a993176745f6b
  1. 我們也可以直接刪除所有鏡像(這裏我又拉取了一個hello-world鏡像方便演示)
docker rmi -f $(docker images -aq) 

# 先刪除mysql鏡像
Untagged: mysql:5.7
Untagged: mysql@sha256:32f9d9a069f7a735e28fd44ea944d53c61f990ba71460c5c183e610854ca4854
Deleted: sha256:9cfcce23593a93135ca6dbf3ed544d1db9324d4c40b5c0d56958165bfaa2d46a
Deleted: sha256:98de3e212919056def8c639045293658f6e6022794807d4b0126945ddc8324be

# 接着刪除hello-world鏡像
Untagged: hello-world:latest
Untagged: hello-world@sha256:d58e752213a51785838f9eed2b7a498ffa1cb3aa7f946dda11af39286c3db9a9
Deleted: sha256:bf756fb1ae65adf866bd8c456593cd24beb6a0a061dedf42b26a993176745f6b

七、Docker容器命令

1. 容器運行(這裏我們拉取了一個centos7)

docker pull centos:7
docker run -it centos:7 
# 注意看下面的 ip 地址的變化,這裏是我之前的用戶
root@10.200.25.224[23:25:54]:~
$ docker run -it centos:7
# 接着我進行運行容器後進入到容器中的centos中了
[root@6b91ac8e3d9d /]# ls
anaconda-post.log  dev  home  lib64  mnt  proc  run   srv  tmp  var
bin                etc  lib   media  opt  root  sbin  sys  usr

2. 退出容器

exit

3. 列出的容器運行信息

3.1 列出當前運行的容器

docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
79496fc1a948        centos:7            "/bin/bash"         About a minute ago   Up About a minute                       peaceful_austin

3.2 列出當前容器和容器運行歷史

docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                         PORTS               NAMES
79496fc1a948        centos:7            "/bin/bash"         8 seconds ago       Up 8 seconds                                       peaceful_austin
6b91ac8e3d9d        centos:7            "/bin/bash"         2 minutes ago       Exited (130) 20 seconds ago                        peaceful_gagarin

4. 刪除容器

4.1 刪除指定的容器,但是不能刪除正在運行的容器,如果需要強制刪除 rm -f

docker rm 容器id
# 可以看到,這個容器正在運行,所以是不可以刪除的
root@10.200.25.224[23:29:50]:~
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
79496fc1a948        centos:7            "/bin/bash"         About a minute ago   Up About a minute                       peaceful_austin
# 然後我們進行刪除,可以看到出現了錯誤
root@10.200.25.224[23:30:16]:~
$ docker rm 79496fc1a948
Error response from daemon: You cannot remove a running container 79496fc1a948a7110638e22014860894097505ea8fce16eebdce8963752c66cc. Stop the container before attempting removal or force remove

4.2 刪除所有的容器

4.2.1 刪除所有容器方式一

docker rm -f $(docker ps -aq)
root@10.200.25.224[23:29:50]:~
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
79496fc1a948        centos:7            "/bin/bash"         About a minute ago   Up About a minute                       peaceful_austin
root@10.200.25.224[23:31:25]:~
$ docker rm -f $(docker ps -aq)
# 成功的刪除了
79496fc1a948

4.2.1 刪除所有容器方式二

docker ps -a -q|xargs docker rm 

5. 退出容器

5.1 將容器停止然後退出

exit

5.2 容器不停止然後退出,注意了,這個是一個組合快捷鍵操作

Ctrl + P + Q

6. 在容器外,也就是通過docker命令對容器進行操作

6.1 啓動容器

docker start 容器id

6.2 重啓容器

docker restart 容器id

6.3 停止當前正在運行容器

docker stop 容器id

6.4 強制停止當前容器

docker kill 容器id

6.5 這裏對上面的命令效果進行一次性的展示


# 停止 -> 啓動 -> 重啓 -> 強行關閉
# stop -> start -> restart -> kill
# 每個階段都進行當前運行容器的結果打印,我們可以通過這個觀察到結果
root@10.200.25.224[00:06:10]:~
$ docker stop f81027372ded
f81027372ded
root@10.200.25.224[00:06:35]:~
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
root@10.200.25.224[00:06:38]:~
$ docker start f81027372ded
f81027372ded
root@10.200.25.224[00:06:50]:~
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
f81027372ded        centos:7            "/bin/bash"         31 minutes ago      Up 3 seconds                            goofy_robinson
root@10.200.25.224[00:06:53]:~
$ docker restart f81027372ded
f81027372ded
root@10.200.25.224[00:07:14]:~
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
f81027372ded        centos:7            "/bin/bash"         31 minutes ago      Up 1 second                             goofy_robinson
root@10.200.25.224[00:07:16]:~
$ docker kill f81027372ded   
f81027372ded
root@10.200.25.224[00:07:34]:~
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

八、Docker 進階命令

1. Docker 後臺啓動

1.1 直接啓動容器,但是如果容器沒有前臺進程,docker沒有發現有前臺應用的運行,就會自動停止。 例如nginx容器啓動後發現自己沒有提供服務就會立刻停止。

docker run -d centos
root@10.185.25.224[10:07:41]:~
# centos後臺的打開之後然後查看正在運行的容器,發現並沒有這個容器的運行
# 這個就是由於沒有前臺程序而被關閉導致的
$ docker run -d centos
eaf19f1af3f82715293656d5f4f37fb5bd96dc0b565cf6cbdcb7e7e2622fe637
root@10.185.25.224[10:07:51]:~
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

1.2 給容器安排一些前臺任務,然後進行後臺啓動

docker run -d centos /bin/sh -c "while true;do echo centos is running;sleep 1;done"
# 這裏我們給centos的後臺啓動安排了一些前臺的任務,發現啓動centos之後並沒有停止
root@10.185.25.224[10:08:00]:~
$ docker run -d centos /bin/sh -c "while true;do echo centos is running;sleep 1;done"
10fc22834a19c63e7446c03c32b11ef156cf5d2a550b52ae93b836db338ecfa4
root@10.185.25.224[10:08:10]:~
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
10fc22834a19        centos              "/bin/sh -c 'while t…"   6 seconds ago       Up 5 seconds                            charming_bardeen

1.3 剛剛給centos安排了前臺日誌打印任務,接下來可以看看日誌打印命令

docker logs -tf --tail 10 容器id
-tf  表示顯示日誌
--tail number 表示要顯示的日誌的條數
# 我們進行日誌打印
root@10.185.25.224[10:08:16]:~
$ docker logs -tf --tail 10 10fc22834a19
2020-06-11T02:08:23.769922850Z centos is running
2020-06-11T02:08:24.772259465Z centos is running
2020-06-11T02:08:25.774665998Z centos is running

2. 進入到後臺運行的容器

2.1 新的後臺命令窗口創建

docker exec -it 容器id bashShell

查看我們當前正在運行的進程

docker ps
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
28cf2fa3a0bb        centos              "/bin/sh -c 'while t…"   18 seconds ago      Up 17 seconds                           kind_kilby

打開後臺的命令行

docker exec -it 28cf2fa3a0bb /bin/bash
root@10.185.25.224[11:04:46]:~
$ docker exec -it 28cf2fa3a0bb /bin/bash
# 可以看到下面的root用戶名變爲了ID,可見打開了新的命令行
[root@28cf2fa3a0bb /]# ls
bin  etc   lib    lost+found  mnt  proc  run   srv  tmp  var
dev  home  lib64  media       opt  root  sbin  sys  usr

2.2 進入當前容器正在執行的終端,不會啓動新的進程

我們進入後臺正在執行的命令窗口

docker attch 容器id
# 我們之前添加的後臺日誌打印還在執行
root@10.185.25.224[11:07:06]:~
$ docker attach 28cf2fa3a0bb 
centos is running
centos is running
centos is running
centos is running
centos is running
...

3. 從容器內拷貝文件到主機

3.1 手動從容器中拷貝文件到主機

命令格式:

docker cp 容器id:容器內路徑 目的的主機路徑

示例:

docker cp 28cf2fa3a0bb:/home/test.java /home

接下來演示一波完整的操作:

# 查看當前運行的容器
root@10.185.25.224[11:19:14]:~
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
28cf2fa3a0bb        centos              "/bin/sh -c 'while t…"   14 minutes ago      Up 14 minutes                           kind_kilby
# 進入目標容器centos的容器命令行
root@10.185.25.224[11:20:21]:~
$ docker exec -it 28cf2fa3a0bb /bin/bash
# 進入容器centos /home 目錄,並且創建test.java文件
[root@28cf2fa3a0bb /]# cd /home
[root@28cf2fa3a0bb home]# ls
[root@28cf2fa3a0bb home]# touch test.java
[root@28cf2fa3a0bb home]# ls
test.java
# 退出容器centos,回到我們主機的命令窗口
[root@28cf2fa3a0bb home]# exit
exit
# 查看我們當前運行容器
root@10.185.25.224[11:21:40]:~
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
28cf2fa3a0bb        centos              "/bin/sh -c 'while t…"   17 minutes ago      Up 17 minutes                           kind_kilby
# 進入到主機的 /home 目錄,並且查看目錄下沒有其他文件
root@10.185.25.224[11:21:47]:~
$ cd /home
root@10.185.25.224[11:22:04]:/home
$ ll
total 0
# 將容器centos中 /home/test.java 文件複製到主機的 /home 目錄下面
root@10.185.25.224[11:22:25]:/home
$ docker cp 28cf2fa3a0bb:/home/test.java /home
# 再次查看我們主機 /home 目錄下的文件,可以看到文件已經成功複製過來了
root@10.185.25.224[11:22:36]:/home
$ ls
test.java

3.2 補充:上面的拷貝是一個手動的過程,我麼也可以使用 -v 卷技術,實現自動的同步

  • 比如同步容器中 /home 目錄和主機目錄 /home 中的文件

九、Docker Docker 運行Nginx

1. 拉取ngix鏡像

docker ngix
docker images

2. 打開nginx

我們指定啓動容器的名稱,同時指定主機端口和容器端口的映射

docker run -d --name nginx01 -p 3344:80 nginx

這裏我們可以看到啓動成功了

[root@iZ2ze1ycujbqzy1mnrzufbZ ~]# docker run -d --name nginx01 -p 3344:80 nginx
d032c18eff37294910e41de5985df78f8a93e20eab2ce9025949a9e136c6201b

這個是對上面命令進行簡單參數的講解

-d      表示後臺運行
--name  表示給新建的容器進行命名
-p      指定 宿主機端口號:容器內部端口號

接着我麼查看正在運行的容器

docker ps   

這裏可以看到nginx正常運行

[root@iZ2ze1ycujbqzy1mnrzufbZ ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
d032c18eff37        nginx               "/docker-entrypoint.…"   8 seconds ago       Up 7 seconds        0.0.0.0:3344->80/tcp   nginx01
28cf2fa3a0bb        centos              "/bin/sh -c 'while t…"   3 hours ago         Up 3 hours                                 kind_kilby

然後通過宿主機對容器進行訪問

curl localhost:3344

返回了nginx的主頁

[root@iZ2ze1ycujbqzy1mnrzufbZ ~]# curl localhost:3344
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
...
</html>

當然我們也可以通過我們的windows對容器進行訪問,但是你需要關閉你的防火牆

關閉你的防火牆

 systemctl stop firewalld.service 

如果你是阿里雲的話,那麼還需要配置你的阿里雲安全組

最後來看一下效果

在這裏插入圖片描述
2. 這裏我們補充一下進入nginx命令行進行nginx配置文件查看的命令

docker exec -it nginx01 /bin/bash

whereis nginx
# 進入nginx命令行
[root@iZ2ze1ycujbqzy1mnrzufbZ ~]# docker exec -it nginx01 /bin/bash
# 查看nginx的配置文件
root@d032c18eff37:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@d032c18eff37:/# exit
exit
# 查看運行的容器
[root@iZ2ze1ycujbqzy1mnrzufbZ ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
d032c18eff37        nginx               "/docker-entrypoint.…"   40 minutes ago      Up 40 minutes       0.0.0.0:3344->80/tcp   nginx01
28cf2fa3a0bb        centos              "/bin/sh -c 'while t…"   3 hours ago         Up 3 hours                                 kind_kilby

十、Docker 運行Tomcat

1. 拉取tomcat:9.0的鏡像

docker pull tomcat:9.0

2. 運行tomcat:9.0的容器

docker run -d --name tomcat -p 8080:8080 tomcat:9.0 
[root@iZ2ze1ycujbqzy1mnrzufbZ tomcat]# docker run -d --name tomcat -p 8080:8080 tomcat:9.0    
482ef7e6ca1ab8e3c814b4429a7f25684d032d54d5fc3eeb20cda04a3a9373ff
[root@iZ2ze1ycujbqzy1mnrzufbZ tomcat]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
482ef7e6ca1a        tomcat:9.0          "catalina.sh run"   52 seconds ago      Up 51 seconds       0.0.0.0:8080->8080/tcp   tomcat

3. 由於鏡像中是簡化版,所以想要讓我們windows訪問到的話還是需要其他的一些操作

如果沒有配置,我們是訪問不了我們的tomcat的,因爲容器中的tomcat的webapps目錄下是沒有文件的。

在這裏插入圖片描述

# 首先我們進入tomcat的命令行
[root@iZ2ze1ycujbqzy1mnrzufbZ tomcat]# docker exec -it 482ef7e6ca1a /bin/bash
# 進入到webapps目錄中發現目錄中是空的
root@482ef7e6ca1a:/usr/local/tomcat# ls
BUILDING.txt     LICENSE  README.md      RUNNING.txt  conf  logs            temp     webapps.dist
CONTRIBUTING.md  NOTICE   RELEASE-NOTES  bin          lib   native-jni-lib  webapps  work
root@482ef7e6ca1a:/usr/local/tomcat# cd webapps
# 發現是空的目錄,所以我們訪問tomcat的時候是 404
root@482ef7e6ca1a:/usr/local/tomcat# ls

這裏我們開始修改

# 接着我們退出webapps目錄,然後刪除這個目錄
root@482ef7e6ca1a:/usr/local/tomcat# cd ../
root@482ef7e6ca1a:/usr/local/tomcat# rm -rf webapps
root@482ef7e6ca1a:/usr/local/tomcat# ls
BUILDING.txt     LICENSE  README.md      RUNNING.txt  conf  logs            temp          work
CONTRIBUTING.md  NOTICE   RELEASE-NOTES  bin          lib   native-jni-lib  webapps.dist
# 接着我們將webapps.dist目錄進行復制,因爲裏面有我們需要的網頁
root@482ef7e6ca1a:/usr/local/tomcat# cp -r webapps.dist/ webapps
root@482ef7e6ca1a:/usr/local/tomcat# ls
BUILDING.txt     LICENSE  README.md      RUNNING.txt  conf  logs            temp     webapps.dist
CONTRIBUTING.md  NOTICE   RELEASE-NOTES  bin          lib   native-jni-lib  webapps  work
# 接着我們再次進入webapps目錄,可以發現裏面有了我們需要的網頁,於是這個時候我們可以進行訪問
root@482ef7e6ca1a:/usr/local/tomcat# cd webapps
root@482ef7e6ca1a:/usr/local/tomcat/webapps# ls
ROOT  docs  examples  host-manager  manager

4. 這個時候我們就可以進行訪問了

在這裏插入圖片描述


十一、Docker 安裝Elasticsearch

1. 首先還是進入到官方我們尋找我們需要下載的elasticsearch的版本

docker pull elasticsearch:7.7.1

2. 接着我們可以啓動elasticsearch

說明:es 是非常耗費內存的,暴露的端口也是非常的多。我們es 的數據一般放到安全目錄進行掛在。

2.1 直接或後臺啓動,並且配置端口號

docker run -d --name elasticsearch01 -p 9000:9000 -p 9100:9100 \
-e "discovery.type=single-node" \
elasticsearch:7.7.1

查看我們docker容器的狀態

docker stats

如果沒有配置elasticsearch的內存直接啓動,可以看到這裏內存佔用率非常高

CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT   MEM %               NET I/O             BLOCK I/O           PIDS
a22dc2c201b5        elasticsearch01     0.43%               1.222GiB / 3.7GiB   33.01%              0B / 0B             0B / 0B             50

2.2 我們配置了JVM內存然後在啓動,根據自己的內存進行配置

docker run -d --name elasticsearch02 -p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.7.1
docker stats

可以看到這裏的內存佔用就非常的少

CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT   MEM %               NET I/O             BLOCK I/O           PIDS
18589235188c        elasticsearch02     0.54%               389MiB / 3.7GiB     10.27%              0B / 0B             0B / 0B             49

接着我們可以進行內網測試

curl localhost:9200
{
  "name" : "18589235188c",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "zi31IZG8Th6QwiaU3jD-0A",
  "version" : {
    "number" : "7.7.1",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "ad56dce891c901a492bb1ee393f12dfff473a423",
    "build_date" : "2020-05-28T16:30:01.040088Z",
    "build_snapshot" : false,
    "lucene_version" : "8.5.1",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

外網測試

http://ip:9200

在這裏插入圖片描述


補充:Docker 圖形工具Portainer

1. 下載圖形界面工具 Portainer

docker run -d -p 8088:9000 \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock \
--privileged=true portainer/portainer 

2. 測試

內網測試

curl localhost:8088

外網測試

http://ip:8088

內部界面可以管理你的 images、containers
在這裏插入圖片描述


補充:Docker 製作自己的鏡像(images)

1. 啓動一個tomcat

啓動過程如下

[root@iZ2ze1ycujbqzy1mnrzufbZ ~]# docker ps -a
482ef7e6ca1a        tomcat:9.0            "catalina.sh run"        18 hours ago        Up 16 minutes                 0.0.0.0:8080->8080/tcp   tomcat
[root@iZ2ze1ycujbqzy1mnrzufbZ ~]# docker start 482ef7e6ca1a
482ef7e6ca1a

2. 修改這個默認的tomcat(這裏我們修改了其中的webapps,默認這個文件下面是沒有文件的)

這裏我們直接打開tomcat進行修改,其中的過程就省略了。

[root@iZ2ze1ycujbqzy1mnrzufbZ ~]# docker exec -it 482ef7e6ca1a /bin/bash
...
root@482ef7e6ca1a:/usr/local/tomcat/webapps# pwd
/usr/local/tomcat/webapps
root@482ef7e6ca1a:/usr/local/tomcat/webapps# ls
ROOT  docs  examples  host-manager  manager

3. 接着提交我們剛剛修改的tomcat作爲本地的一個新的鏡像

首先我們可以看看基本的命令格式

# 基本的命令格式
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
# 這邊是幫助文檔
Options:
  -a, --author string    Author (e.g., "John Hannibal Smith <[email protected]>")
  -c, --change list      Apply Dockerfile instruction to the created image
  -m, --message string   Commit message
  -p, --pause            Pause container during commit (default true)

這裏做一個示例

docker commit -a="author" -m="add webapps app" 482ef7e6ca1a tomcatmyself:1.0

可以看到這裏我們再次查看鏡像的時候有了我們剛剛放入的新的image

[root@iZ2ze1ycujbqzy1mnrzufbZ ~]# docker commit -a="author" -m="add webapps app" 482ef7e6ca1a tomcatmyself:1.0           
sha256:f1a19a0d7ecbc742ec49d63518d570a6dd4a6f5cf9dacd72ad39d6283fa5b705
[root@iZ2ze1ycujbqzy1mnrzufbZ ~]# docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
tomcatmyself          1.0                 f1a19a0d7ecb        7 seconds ago       652MB

4. 接着我們進行自己提交的鏡像測試

命令都是一樣的,我們下面進行一波演示

# 啓動我們的自己製作的鏡像
[root@iZ2ze1ycujbqzy1mnrzufbZ ~]# docker run -d -p 8080:8080 tomcatmyself:1.0
6ed4d2c6a665af96ffce1899ee747d3fe74678b6cd7f1028d04d85de6fd3a413
[root@iZ2ze1ycujbqzy1mnrzufbZ ~]# docker ps
CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS              PORTS                    NAMES
6ed4d2c6a665        tomcatmyself:1.0      "catalina.sh run"   15 seconds ago      Up 14 seconds       0.0.0.0:8080->8080/tcp   stoic_stonebraker
26b01cf00919        portainer/portainer   "/portainer"        18 hours ago        Up 13 hours         0.0.0.0:8088->9000/tcp   eloquent_rosalind
[root@iZ2ze1ycujbqzy1mnrzufbZ ~]# docker exec -it 6ed4d2c6a665 /bin/bash
root@6ed4d2c6a665:/usr/local/tomcat# ls
BUILDING.txt  CONTRIBUTING.md  LICENSE  NOTICE  README.md  RELEASE-NOTES  RUNNING.txt  bin  conf  lib  logs  native-jni-lib  temp  webapps  webapps.dist  work
# 查看webapps是否存在目錄
root@6ed4d2c6a665:/usr/local/tomcat# cd webapps
root@6ed4d2c6a665:/usr/local/tomcat/webapps# ls
ROOT  docs  examples  host-manager  manager
# 本地連接測試
root@6ed4d2c6a665:/usr/local/tomcat/webapps# curl localhost:8080
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <title>Apache Tomcat/9.0.36</title>
        <link href="favicon.ico" rel="icon" type="image/x-icon" />
        <link href="favicon.ico" rel="shortcut icon" type="image/x-icon" />
        <link href="tomcat.css" rel="stylesheet" type="text/css" />
    </head>
    ...

補充:Docker 容器數據卷(目錄掛載技術)

說明:如果我們的MySQL作爲容器進行運行,那麼很有可能這個容器會被不小心的刪除。這樣子的話就存在很嚴重的安全隱患,所以Docker中就存在着一種容器數據卷技術,使得容器和主機之間實現數據共享,使得我們可以將MySQL的數據可以存儲在本地。這樣子的話我們就可以將容器內的目錄掛載到Linux上面。

總結:這個容器數據卷使得容器可以進行持久化和同步操作,容器間就可以實現數據共享了。

在這裏插入圖片描述

1. 說明

# 基本格式
docker run -it -v 主機目錄:容器目錄 centos /bin/bash
# 綁定掛載卷 參數
-v, --volume list                    Bind mount a volume

2. 示例

我們進行文件的掛載

docker run -it -v /home/centos:/home centos /bin/bash

我們可以查看我們容器的詳細配置信息

docker inspect 513af28f55c5  

下面進行一波演示

[root@iZ2ze1ycujbqzy1mnrzufbZ centos]# docker ps
CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS              PORTS                    NAMES
513af28f55c5        centos                "/bin/bash"         14 minutes ago      Up 14 minutes                                pedantic_volhard
[root@iZ2ze1ycujbqzy1mnrzufbZ centos]# docker inspect 513af28f55c5  
# 下面是其中關鍵的掛載信息
"Mounts": [
    {
        "Type": "bind",
        # 主機目錄
        "Source": "/home/centos",
        # 容器目錄 
        "Destination": "/home",
        "Mode": "",
        "RW": true,
        "Propagation": "rprivate"
    }
]

3. 我們進行測試

3.1 我們進行容器:主機同步

接着我們已經掛載好了我們的容器,我們先在容器中創建一個文件;然後到我們主機看一下是否有同步。

這個是容器目錄

[root@513af28f55c5 /]# pwd
/home
[root@513af28f55c5 home]# touch makeInContainer
[root@513af28f55c5 home]# ls
makeInContainer

這個是主機目錄

[root@iZ2ze1ycujbqzy1mnrzufbZ home]# pwd
/home/centos
# 這裏我們看到了主機已經和容器已經同步了
[root@iZ2ze1ycujbqzy1mnrzufbZ centos]# ls
makeInContainer

3.1 我們進行主機:容器同步

主機創建文件

[root@iZ2ze1ycujbqzy1mnrzufbZ centos]# touch madeInMyLinux
[root@iZ2ze1ycujbqzy1mnrzufbZ centos]# ls
madeInMyLinux  makeInContainer

可以看到容器中也是已經同步了

[root@513af28f55c5 home]# ls
madeInMyLinux  makeInContainer

4. 思考

我們以後就可以將一些關鍵的文件掛載到我們的主機,把一些容器中的配置文件進行掛載會大大提升我們的效率。


實戰:Docker MySQL實戰(數據卷的強大之處)

1. 鏡像的拉取

docker pull myslq:5.7

2. 運行鏡像並且配置數據卷

簡單的命令格式

 docker run \
 --name 容器命名 \
 -v 主機配置文件:容器映射配置文件 \
 -e MYSQL_ROOT_PASSWORD=密碼 \
 -d \
 -p 主機端口:容器端口 \
 mysql:tag

示例

 docker run \
 --name mymysql01 \
 -v /home/mysql/conf:/etc/mysql/conf.d \
 -v /home/mysql/data:/var/lib/mysql \
 -e MYSQL_ROOT_PASSWORD=root \
 -d \
 -p 3306:3306 \
 mysql:5.7

然後查看效果

[root@iZ2ze1ycujbqzy1mnrzufbZ data]#  docker run \
>  --name mymysql01 \
>  -v /home/mysql/conf:/etc/mysql/conf.d \
>  -v /home/mysql/data:/var/lib/mysql \
>  -e MYSQL_ROOT_PASSWORD=root \
>  -d \
>  -p 3306:3306 \
>  mysql:5.7
4c46fefed66c5343860075a4a17e6b04253fcc24a32a89159240572f15c5a9b0
[root@iZ2ze1ycujbqzy1mnrzufbZ data]# docker ps
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                               NAMES
4c46fefed66c        mysql:5.7             "docker-entrypoint.s…"   3 seconds ago       Up 2 seconds        0.0.0.0:3306->3306/tcp, 33060/tcp   mymysql01
6ed4d2c6a665        tomcatmyself:1.0      "catalina.sh run"        4 hours ago         Up 4 hours          0.0.0.0:8080->8080/tcp              stoic_stonebraker
26b01cf00919        portainer/portainer   "/portainer"             22 hours ago        Up 17 hours         0.0.0.0:8088->9000/tcp              eloquent_rosalind
[root@iZ2ze1ycujbqzy1mnrzufbZ data]# docker ps
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                               NAMES
4c46fefed66c        mysql:5.7             "docker-entrypoint.s…"   13 seconds ago      Up 13 seconds       0.0.0.0:3306->3306/tcp, 33060/tcp   mymysql01

這裏我們可以進入主機的與容器關聯的數據卷,可以看到主機已經和容器的數據捲進行了關聯。

[root@iZ2ze1ycujbqzy1mnrzufbZ data]# pwd
/home/mysql/data
[root@iZ2ze1ycujbqzy1mnrzufbZ data]# ls
auto.cnf    ca.pem           client-key.pem  ibdata1      ib_logfile1  mysql               private_key.pem  server-cert.pem  sys
ca-key.pem  client-cert.pem  ib_buffer_pool  ib_logfile0  ibtmp1       performance_schema  public_key.pem   server-key.pem

最後官網有更加詳細的關於mysql的解釋,可以自行查看

3. 進行連接

打開sqlyon進行連接

在這裏插入圖片描述

然後我們創建一個數據庫

CREATE DATABASE test;

在這裏插入圖片描述

到主機的掛載目錄進行查看,可以看到多了一個test數據庫

[root@iZ2ze1ycujbqzy1mnrzufbZ data]# ls
auto.cnf    ca.pem           client-key.pem  ibdata1      ib_logfile1  mysql               private_key.pem  server-cert.pem  sys
ca-key.pem  client-cert.pem  ib_buffer_pool  ib_logfile0  ibtmp1       performance_schema  public_key.pem   server-key.pem  
test

實戰:Docker 具名和匿名掛載(Nginx作爲示例)

1. 匿名掛載(不推薦使用)

匿名掛載僅僅寫了容器中的路徑,但是沒有明確指定主機的路徑。

參數解釋

-v 容器內路徑

示例

docker run -d -P --name nginx01 -v /etc/nginx nginx

2. 具名掛載(推薦使用)

docker run -d -P --name nginx01 -v ngnix:/etc/nginx nginx

3. 我們查看所有 volume(卷) 的情況

docker volume ls

示例

docker volume inspect ngnix 

可以看到我們多出來了一個分卷

[root@iZ2ze1ycujbqzy1mnrzufbZ _data]# docker volume ls
DRIVER              VOLUME NAME
...
local               e13d69859f2c8c5fb2efa5e5efef402fb1fbb5bf9a3e6a8d2a09ef73cb4d5009
local               ec3214d3261aee1842737e89b2c6e26fc4e2eb9c5b884677200e5927ecfe7620
local               f726a8e68358c026c239f523e8f2ae11fb65a25e8f85bb370fe61d6b895ca943
# 這個就是我們剛剛通通過 具名 創建的分卷
local               ngnix01

最後我們可以查看這個分卷裏面有什麼內容

我們所有的具名分卷信息都會被放到以下的路徑中。

/var/lib/docker/volumes

可以看看我們分卷信息

[root@iZ2ze1ycujbqzy1mnrzufbZ volumes]# ls
89847daf0586906d9f2916aea7ee27f778d55b76c6ffe0ad43d9dc0c30445166  ec3214d3261aee1842737e89b2c6e26fc4e2eb9c5b884677200e5927ecfe7620
95ce41af1f9cfd947a3e22088d30606674aafb0179cb689cad876f930062eaee  f726a8e68358c026c239f523e8f2ae11fb65a25e8f85bb370fe61d6b895ca943
a8b5172810b149629f1fcb702598e7579ca56dca8c26b2d30964d0d6469209e1  metadata.db
ngnix01

接着我們進入到我們的分卷

這個是分卷中的內容
conf.d  fastcgi_params  koi-utf  koi-win  mime.types  modules  nginx.conf  scgi_params  uwsgi_params  win-utf

一下是具體操作過程

[root@iZ2ze1ycujbqzy1mnrzufbZ volumes]# cd ngnix01/
[root@iZ2ze1ycujbqzy1mnrzufbZ ngnix01]# ls
_data
[root@iZ2ze1ycujbqzy1mnrzufbZ ngnix01]# cd _data/
# 進入到具體目錄可以看到下面主要的配置內容和數據文件
[root@iZ2ze1ycujbqzy1mnrzufbZ _data]# ls
conf.d  fastcgi_params  koi-utf  koi-win  mime.types  modules  nginx.conf  scgi_params  uwsgi_params  win-utf
[root@iZ2ze1ycujbqzy1mnrzufbZ _data]# cat nginx.conf 
user  nginx;
worker_processes  1;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
events {
    worker_connections  1024;
}
...

4. 區分具名、匿名、指定路徑3中掛載方式

直接看具體格式

-v 容器內路徑            # 匿名拓展
-v 卷名:容器內路徑        # 具名拓展
-v /宿主機路徑:容器路徑    # 指定路徑拓展

5. 拓展,如何限制容器內數據卷文件的讀寫權限

ro  readonly   # 只讀
rw  readwrite  # 只寫

示例

docker run -d -P --name nginx02 -v ngnix:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v ngnix:/etc/nginx:re nginx

實戰:Docker Dockerfile構建鏡像(可以配置我們的數據卷)

1. 編寫腳本

# 這裏我們選取一個基礎鏡像,就是我們的centos(本地需要已經有這個鏡像文件了)
FROM centos

# 匿名數據卷的指定
VOLUME ["volume01","volume02"]

# 這裏我們會進行打印
CMD echo "-----end------"
# 指定新鏡像中默認的進入命令行參數
CMD /bin/bash

2. 執行構建命令

基本命令格式

docker build [OPTIONS] PATH | URL | -
    # 配置參數
    -f, --file string             Name of the Dockerfile (Default is 'PATH/Dockerfile')
    -t, --tag list                Name and optionally a tag in the 'name:tag' format
docker build -f /home/dockerfile  -t mycentos:1.0 .
# 這裏我們選擇了 /home 目錄
[root@iZ2ze1ycujbqzy1mnrzufbZ home]# pwd
/home
# 編寫我們的腳本
[root@iZ2ze1ycujbqzy1mnrzufbZ home]# cat dockerfile 
FROM centos

VOLUME ["volume01","volume02"]

CMD echo "-----end------"
CMD /bin/bash
# 進行構建
[root@iZ2ze1ycujbqzy1mnrzufbZ home]# docker build -f /home/dockerfile  -t mycentos:1.0 .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM centos
 ---> 470671670cac
Step 2/4 : VOLUME ["volume01","volume02"]
 ---> Running in 39f9bb1881d3
Removing intermediate container 39f9bb1881d3
 ---> 3445937203bf
Step 3/4 : CMD echo "-----end------"
 ---> Running in 939d4f912c0d
Removing intermediate container 939d4f912c0d
 ---> 3a9420c3df19
Step 4/4 : CMD /bin/bash
 ---> Running in 92db989a2cf2
Removing intermediate container 92db989a2cf2
 ---> 6ca2017f1075
Successfully built 6ca2017f1075
Successfully tagged mycentos:1.0

3. 測試最終的效果

這裏我們可以看到我們剛剛構建的鏡像

[root@iZ2ze1ycujbqzy1mnrzufbZ home]# docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
mycentos              1.0                 6ca2017f1075        3 minutes ago       237M

然後我們運行我們的鏡像,可以看到我們剛剛設置的數據卷 volume01 volume02

[root@iZ2ze1ycujbqzy1mnrzufbZ /]# docker run -it mycentos:1.0 /bin/bash
[root@a14ef03845bf /]# ls
bin  etc   lib    lost+found  mnt  proc  run   srv  tmp  var       volume02
dev  home  lib64  media       opt  root  sbin  sys  usr  volume01

接着我們進入我們主機查看我們容器映射的鏡像

[root@iZ2ze1ycujbqzy1mnrzufbZ ~]# docker ps
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                               NAMES
a14ef03845bf        mycentos:1.0          "/bin/bash"              4 minutes ago       Up 4 minutes                                            jolly_euler
[root@iZ2ze1ycujbqzy1mnrzufbZ ~]# docker inspect a14ef03845bf
# 這裏我們提取了關鍵的數據卷信息
"Mounts": [
{
    "Type": "volume",
    "Name": "a2657de74fbe0f882cae935a7393ea6862a0ae4ba427b7e5c5e6b03fb31ea727",
    # 這裏是我們主機的目錄
    "Source": "/var/lib/docker/volumes/a2657de74fbe0f882cae935a7393ea6862a0ae4ba427b7e5c5e6b03fb31ea727/_data",
    # 這裏是我們容器中的目錄
    "Destination": "volume01",
    "Driver": "local",
    "Mode": "",
    "RW": true,
    "Propagation": ""
},
{
    "Type": "volume",
    "Name": "47f556747d1650c4be3eb5adb8f3775e0f2d445e80201a414e2bf34bd46e7a24",
    "Source": "/var/lib/docker/volumes/47f556747d1650c4be3eb5adb8f3775e0f2d445e80201a414e2bf34bd46e7a24/_data",
    "Destination": "volume02",
    "Driver": "local",
    "Mode": "",
    "RW": true,
    "Propagation": ""
}

這裏我們在容器中創建文件

[root@a14ef03845bf volume01]# pwd
/volume01
[root@a14ef03845bf volume01]# ls   
[root@a14ef03845bf volume01]# touch mycentos
[root@a14ef03845bf volume01]# ls
mycentos

接着查看我們主機的目錄,可以看到文件也是刷新了

[root@iZ2ze1ycujbqzy1mnrzufbZ ~]# cd /var/lib/docker/volumes/a2657de74fbe0f882cae935a7393ea6862a0ae4ba427b7e5c5e6b03fb31ea727/
[root@iZ2ze1ycujbqzy1mnrzufbZ a2657de74fbe0f882cae935a7393ea6862a0ae4ba427b7e5c5e6b03fb31ea727]# ls
_data
[root@iZ2ze1ycujbqzy1mnrzufbZ a2657de74fbe0f882cae935a7393ea6862a0ae4ba427b7e5c5e6b03fb31ea727]# cd _data/
[root@iZ2ze1ycujbqzy1mnrzufbZ _data]# ls
mycentos

實戰:Docker 容器數據卷共享(最後附加MySQL的數據共享示例)

1. 首先我們先啓動3個容器並且進行關聯

1.1 我們使用之前用Dockerfile製作的鏡像進行測

編寫腳本

FROM centos

VOLUME ["volume01","volume02"]

CMD echo "-----end------"
CMD /bin/bash

運行腳本

docker build -f /home/dockerfile  -t mycentos:1.0 .

查看是否創建成功

[root@iZ2ze1ycujbqzy1mnrzufbZ home]# docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
mycentos              1.0                 6ca2017f1075        18 hours ago        237MB

1.2 進行容器的啓動

啓動一個容器

docker run -it --name docker01 mycentos:1.0

啓動第二個容器關聯第一個容器

docker run -it --name docker02 --volumes-from docker01 mycentos:1.0

啓動第二個容器關聯第一個容器

docker run -it --name docker03 --volumes-from docker01 mycentos:1.0

2. 進行測試

2.1 我們在容器1和容器2中都進行文件創建觀察是否同步

首先容器1創建文件,看容器2和3是否同步

容器1

[root@31b5eb63485f volume01]# touch docker1
[root@31b5eb63485f volume01]# ls
docker1

容器2

[root@daf0c50c9f13 volume01]# ls
docker1

容器3

[root@09f7085f7be2 volume01]# ls
docker1

可以看到在這幾個容器中的文件都實現了同步

接着我們刪除容器1,查看容器2和容器3是否數據有小時

容器1

[root@iZ2ze1ycujbqzy1mnrzufbZ home]# docker ps 
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS                        PORTS                    NAMES
09f7085f7be2        mycentos:1.0          "/bin/sh -c /bin/bash"   17 minutes ago      Up 17 minutes                                          docker03
daf0c50c9f13        mycentos:1.0          "/bin/sh -c /bin/bash"   17 minutes ago      Up 17 minutes                                          docker02
31b5eb63485f        mycentos:1.0          "/bin/sh -c /bin/bash"   17 minutes ago      Exited (130) 45 seconds ago                            docker01
[root@iZ2ze1ycujbqzy1mnrzufbZ home]# docker rm 31b5eb63485f
31b5eb63485f

容器2

[root@daf0c50c9f13 volume01]# ls
docker1

容器3

[root@09f7085f7be2 volume01]# ls
docker1

可以看到,即使我們將容器1刪除,但是其他兩個容器的數據依舊存在

3. 容器數據卷作用總結

從上面的測試可以看出來,我們可以容器數據卷可以有效的進行數據的同步並且保護我們的數據,即使一個容器被刪除了,但是其他容器中仍然有數據的備份。總而言之,容器之間的數據卷就是一種拷貝機制,實現數據的可以有多個備份。

在這裏插入圖片描述

4. 這裏來演示一波MySQL容器數據卷

啓動一個mysql

 docker run \
 --name mymysql01 \
 -v /etc/mysql/conf.d \
 -v /var/lib/mysql \
 -e MYSQL_ROOT_PASSWORD=root \
 -d \
 -p 3306:3306 \
 mysql:5.7

啓動另外一個mysql綁定其數據卷

 docker run \
 --name mymysql02 \
 --volumes-from mymysql01 \
 -e MYSQL_ROOT_PASSWORD=root \
 -d \
 -p 3307:3306 \
 mysql:5.7

接着來簡單的看一下效果

# 進入到mymysql01容器中的/home目錄下創建文件
root@0ab3d49fa7f2:/var/lib/mysql# cd /home
root@0ab3d49fa7f2:/home# touch mymysql01.test
root@0ab3d49fa7f2:/home# ls
mymysql01.test

# 進入到mymysql02容器/home目錄下查看文件是否同步
root@40a8ec909fa4:/var/lib/mysql# cd /home
root@40a8ec909fa4:/home# ls
mymysql01.file

實戰:Docker Dockerfile進階

1. 我們來看看Dockerfile構建的基本過程

之前我們通過dockerfile簡單構建過一個centos,過程也就是編寫腳本文件,然後執行構建命令。

基本過程如下:

# 這裏我們選取一個基礎鏡像,就是我們的centos(本地需要已經有這個鏡像文件了)
FROM centos

# 匿名數據卷的指定
VOLUME ["volume01","volume02"]

# 這裏我們會進行打印
CMD echo "-----end------"
# 指定新鏡像中默認的進入命令行參數
CMD /bin/bash
docker build -f /home/dockerfile  -t mycentos:1.0 .

2. 接着我們可以看看官網是如何編寫這個Dockerfile文件的

在這裏插入圖片描述

下面這個文件中是最基本的構建命令,基本上就是一個純淨版的centos,沒有安裝其他常用的軟件插件。只是簡單的添加了一些標籤信息。如果我們自己需要構建一個鏡像文件的話就需要額外添加更加多的信息。

在這裏插入圖片描述

3. 我們來看看Dockerfile的構建過程

Dockerfile的命令時從上到下執行的,每一個指令都會提交一個新的鏡像層,並且提交。我們可以通過一幅圖看到其中的效果。

在這裏插入圖片描述

4. DockerFile指令

FROM        # 基礎鏡像,一切都是從這裏開始構建
MAINTAINER  # 鏡像是誰寫的,姓名+郵箱
RUN         # 鏡像構建的時候需要運行的命令
ADD         # 步驟:tomcat,這個tomcat壓縮包!添加內容
WORKDIR     # 鏡像的工作目錄
VOLUME      # 掛載的目錄
EXPOSE      # 暴露端口:比如80,8080,這樣子啓動鏡像就可以直接暴露這個端口而不需要額外代入參數 -p 
CMD         # 指定這個容器啓動的時候需要運行的命令,只有最後一個會生效,可被替代
ENTRYPOINT  # 指定這個容器啓動的時候需要運行的命令,可以追加命令
ONBUILD     # 當構建一個被繼承 mycentos 這個時候就會運行 ONBUILD 的指令。
COPY        # 類似於ADD,將我們的文件拷貝到鏡像中
ENV         # 構建的時候設置環境變量。類似於我們配置es的時候配置的JVM內存大小。

5. Dockfile指令實戰測試

5.1 創建一個centos的mycentos

創建文件

touch mycentos

編輯文件

# 我們的基礎鏡像
FROM centos
# 我們的作者
MAINTAINER root<73@qq.com>
# 環境變量
ENV MYPATH /usr/local
# 鏡像的工作目錄
WORKDIR $MYPATH
# 鏡像構建的時候需要運行的命令
RUN yum -y install vim
RUN yum -y install net-tools
# 設置暴露的端口
EXPOSE 80
# 指定這個容器啓動的時候需要運行的命令
CMD echo $MYPATH
CMD echo "----end----"
CMD ["/bin/bash"]

構建鏡像

docker build -f mycentos -t mycentos:0.1 .

看到構建成功

Successfully built 0bc78e3e6895
Successfully tagged mycentos:0.1

5.2 測試鏡像效果

[root@iZ2ze1ycujbqzy1mnrzufbZ home]# docker images
REPOSITORY            TAG                 IMAGE ID            CREATED              SIZE
mycentos              0.1                 0bc78e3e6895        About a minute ago   321MB
[root@iZ2ze1ycujbqzy1mnrzufbZ home]# docker run -it mycentos:0.1
# 可以看到我們直接進入了 /usr/local
# 同時我們可以直接使用 yum 插件
[root@4d898d6bd6a1 local]# yum install git
Failed to set locale, defaulting to C.UTF-8
Last metadata expiration check: 0:02:53 ago on Sat Jun 13 04:23:16 2020.
Dependencies resolved.

6. 我們可以嘗試查看其他鏡像的Dockerfile的信息

docker history 鏡像id|鏡像name

示例

[root@iZ2ze1ycujbqzy1mnrzufbZ home]# docker history tomcat
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
2eb5a120304e        2 days ago          /bin/sh -c #(nop)  CMD ["catalina.sh" "run"]    0B                  
<missing>           2 days ago          /bin/sh -c #(nop)  EXPOSE 8080                  0B                  
<missing>           2 days ago          /bin/sh -c set -e  && nativeLines="$(catalin…   0B                  
<missing>           2 days ago          /bin/sh -c set -eux;   savedAptMark="$(apt-m…   19.9MB              
<missing>           2 days ago          /bin/sh -c #(nop)  ENV TOMCAT_SHA512=75e16a0…   0B                  
<missing>           2 days ago          /bin/sh -c #(nop)  ENV TOMCAT_VERSION=9.0.36    0B                  
<missing>           2 days ago          /bin/sh -c #(nop)  ENV TOMCAT_MAJOR=9           0B                  
<missing>           2 days ago          /bin/sh -c #(nop)  ENV GPG_KEYS=05AB33110949…   0B                  
<missing>           2 days ago          /bin/sh -c #(nop)  ENV LD_LIBRARY_PATH=/usr/0B                  
<missing>           2 days ago          /bin/sh -c #(nop)  ENV TOMCAT_NATIVE_LIBDIR=0B                  
<missing>           2 days ago          /bin/sh -c #(nop) WORKDIR /usr/local/tomcat     0B                  
<missing>           2 days ago          /bin/sh -c mkdir -p "$CATALINA_HOME"            0B                  
<missing>           2 days ago          /bin/sh -c #(nop)  ENV PATH=/usr/local/tomca…   0B                  
<missing>           2 days ago          /bin/sh -c #(nop)  ENV CATALINA_HOME=/usr/lo…   0B                  
<missing>           3 days ago          /bin/sh -c #(nop)  CMD ["jshell"]               0B                  
<missing>           3 days ago          /bin/sh -c set -eux;   dpkgArch="$(dpkg --pr…   323MB               
<missing>           3 days ago          /bin/sh -c #(nop)  ENV JAVA_URL_VERSION=11.00B                  
<missing>           3 days ago          /bin/sh -c #(nop)  ENV JAVA_BASE_URL=https:/0B                  
<missing>           3 days ago          /bin/sh -c #(nop)  ENV JAVA_VERSION=11.0.7      0B                  
<missing>           3 days ago          /bin/sh -c { echo '#/bin/sh'; echo 'echo "$J…   27B                 
<missing>           3 days ago          /bin/sh -c #(nop)  ENV PATH=/usr/local/openj…   0B                  
<missing>           3 days ago          /bin/sh -c #(nop)  ENV JAVA_HOME=/usr/local/0B                  
<missing>           3 days ago          /bin/sh -c #(nop)  ENV LANG=C.UTF-8             0B                  
<missing>           3 days ago          /bin/sh -c set -eux;  apt-get update;  apt-g…   11.1MB              
<missing>           4 days ago          /bin/sh -c apt-get update && apt-get install…   146MB               
<missing>           4 days ago          /bin/sh -c set -ex;  if ! command -v gpg > /17.5MB              
<missing>           4 days ago          /bin/sh -c apt-get update && apt-get install…   16.5MB              
<missing>           4 days ago          /bin/sh -c #(nop)  CMD ["bash"]                 0B                  
<missing>           4 days ago          /bin/sh -c #(nop) ADD file:1ab357efe422cfed5…   114MB 

實戰:Docker Tomcat的Dockerfile創建

1. 編寫Dockerfile腳本

1.1 在編寫Dockerfile腳本之前,我們需要先準備以下的資源

也就是兩個 .gz 包,一個readme.txt文件

[root@iZ2ze1ycujbqzy1mnrzufbZ tomcat]# ls
apache-tomcat-9.0.36         jdk-8u151-linux-x64.tar.gz
apache-tomcat-9.0.36.tar.gz  mytomcat

1.2 接着我們編寫腳本就可以了

這裏的ADD命令我沒有使用絕對路徑,所以你需要先進入到我們的tomcat目錄下再運行腳本。

# 我們的基礎鏡像
FROM centos
# 我們的作者
MAINTAINER root<73@qq.com>
# 拷貝我們的文件到鏡像中
COPY readme.txt /usr/local/readme.txt
# 添加我們的文件並且會自動解壓到容器中的目標目錄
ADD apache-tomcat-9.0.36.tar.gz /usr/local
ADD jdk-8u151-linux-x64.tar.gz /usr/local
# 環境變量
ENV MYPATH /usr/local
# 鏡像的工作目錄
WORKDIR $MYPATH
# 配置我們的環境
ENV JAVA_HOME /usr/local/jdk1.8.0_151
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.36
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.36
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
# 鏡像構建的時候需要運行的命令,這裏安裝vim和網絡插件
RUN yum -y install vim
RUN yum -y install net-tools
# 設置暴露的端口
EXPOSE 8080
# 指定這個容器啓動的時候需要運行的命令
CMD echo $MYPATH
CMD /usr/local/apache-tomcat-9.0.36/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.36/bin/logs/catalina.out

2. 運行腳本

docker build -f mytomcat -t mytomcat8080 .

效果如下

[root@iZ2ze1ycujbqzy1mnrzufbZ tomcat]# docker build -f mytomcat .
Sending build context to Docker daemon  217.1MB
Step 1/18 : FROM centos
 ---> 470671670cac
Step 2/18 : MAINTAINER root<73@qq.com>
 ---> Using cache
 ---> aae43b8767de
Step 3/18 : COPY readme.txt /usr/local/readme.txt
 ---> e905b2cf947f
Step 4/18 : ADD apache-tomcat-9.0.36.tar.gz /usr/local
 ---> e8ce0bf80922
Step 5/18 : ADD jdk-8u151-linux-x64.tar.gz /usr/local
 ---> b26dcb4d219f
Step 6/18 : ENV MYPATH /usr/local
 ---> Running in 113946c74133

3. 啓動我們剛剛做的tomcat

docker run \
-d \
-p 8080:8080 \
--name mytomcat8080 \
-v /home/tomcatDocker/build/tomcat8080:/usr/loal/apache-tomcat-9.0.36 \
mytomcat8080

4. 進行測試運行

在這裏插入圖片描述


實戰:Docker 發佈自己的鏡像(DokerHub && 阿里雲)

1. 在DockerHub上發佈自己的鏡像

1.1 在DockerHub上註冊自己的賬號

注意註冊完畢之後驗證一下自己是否可以登錄。

1.2 我們嘗試提交我們服務器上的一個鏡像

1.2.1 我們先來登錄自己的docker賬號

命令格式

Usage:  docker login [OPTIONS] [SERVER]

Options:
  -p, --password string   Password
      --password-stdin    Take the password from stdin
  -u, --username string   Username

簡單示例

[root@iZ2ze1ycujbqzy1mnrzufbZ ~]# docker login -uUserName
Password: 

1.2.2 接着我們嘗試提交一波自己的鏡像

命令格式

Usage:  docker push [OPTIONS] NAME[:TAG]

Options:
      --disable-content-trust   Skip image signing (default true)

簡單示例

docker push mytomcat8080

我們這一次的提交被拒絕了,於是我們爲其添加版本號,注意前面需要添加上自己的docker用戶名,否則是會被拒絕的

[root@iZ2ze1ycujbqzy1mnrzufbZ ~]# docker push mytomcat8080
The push refers to repository [docker.io/library/mytomcat8080]
6bfd41890e3b: Preparing 
f5d26df1cb59: Preparing 
841422a0b8e2: Preparing 
698b4f7b83a3: Preparing 
0ef92c7d2dca: Preparing 
0683de282177: Waiting 
denied: requested access to the resource is denied

改變鏡像的tag標籤再次嘗試提交

docker tag 1316c01e5d9d yezhiyue/mytomcat:1.0
docker push yezhiyue/mytomcat:1.0

可以看到我們已經在上傳鏡像了,可能速度會比較慢

[root@iZ2ze1ycujbqzy1mnrzufbZ ~]# docker push yezhiyue/mytomcat:1.0
The push refers to repository [docker.io/yezhiyue/mytomcat]
6bfd41890e3b: Pushing  3.907MB/24.06MB
f5d26df1cb59: Pushing  1.663MB/59.78MB
841422a0b8e2: Pushing  3.292MB/384.4MB

2. 在阿里雲上發佈自己的鏡像

2.1 登錄你的阿里雲,然後找到你的容器鏡像服務

2.2 創建你的命名空間,代表你的一個項目

在這裏插入圖片描述

在這裏插入圖片描述

在這裏插入圖片描述

2.3 創建你的容器鏡像

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

在這裏插入圖片描述

2.4 查看阿里雲給的教程

在這裏插入圖片描述

2.5 我們簡單的通過阿里雲給的教程進行一次提交

[root@iZ2ze1ycujbqzy1mnrzufbZ ~]# docker login --username=******* registry.cn-*******.aliyuncs.com
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
[root@iZ2ze1ycujbqzy1mnrzufbZ ~]# docker tag 1316c01e5d9d registry.cn-beijing.aliyuncs.com/yezhiyueresponsity01/myresponsity01:1.0
[root@iZ2ze1ycujbqzy1mnrzufbZ ~]# docker push registry.cn-beijing.aliyuncs.com/yezhiyueresponsity01/myresponsity01:1.0
The push refers to repository [registry.cn-beijing.aliyuncs.com/yezhiyueresponsity01/myresponsity01]
6bfd41890e3b: Pushing  1.292MB/24.06MB
f5d26df1cb59: Pushing  1.663MB/59.78MB
841422a0b8e2: Pushing  1.621MB/384.4MB
698b4f7b83a3: Pushing  1.366MB/15.6MB

高階:Docker Docker --link 配置直接通過容器名稱進行訪問

1. 容器之間直接進行ping連接

是無法直接獲取數據的

docker exec -it tomcat02 ping tomcat01
[root@iZ2ze1ycujbqzy1mnrzufbZ ~]# docker exec -it tomcat02 ping tomcat01
ping: tomcat01: Name or service not known

2. 指定–link進行連接

配置連接

docker run -d -P --name tomcat03 --link tomcat02 tomcat

現在我們可以直接通過名稱進行數據傳輸

docker exec -it tomcat03 ping tomcat02
[root@iZ2ze1ycujbqzy1mnrzufbZ ~]# docker run -d -P --name tomcat03 --link tomcat02 tomcat
774766747fbcc06e0983473f14d905075dbf15fe244855fc6e9fe48d07c6cc6c
[root@iZ2ze1ycujbqzy1mnrzufbZ ~]# docker exec -it tomcat03 ping tomcat02
PING tomcat02 (172.18.0.2) 56(84) bytes of data.
64 bytes from tomcat02 (172.18.0.2): icmp_seq=1 ttl=64 time=0.104 ms
64 bytes from tomcat02 (172.18.0.2): icmp_seq=2 ttl=64 time=0.088 ms

但是我們無法反向進行連接,最後是連接失敗的

docker exec -it tomcat02 ping tomcat03
[root@iZ2ze1ycujbqzy1mnrzufbZ ~]# docker exec -it tomcat02 ping tomcat03
ping: tomcat03: Name or service not known

3. 進行docker橋接網絡信息的查看

3.1 首先查看我們的網絡信息

docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
b259290f477e        bridge              bridge              local
48e7078f2a8f        host                host                local
368354496e72        none                null                local

下面這個橋接網絡是我們docker分析的關鍵。
b259290f477e bridge bridge local

3.2 接着我們查看網絡的詳細信息

接下來我們會提取出其中的關鍵部分

docker network inspect b259290f477e

下面是容器ip的詳細信息

"Containers": {
    "774766747fbcc06e0983473f14d905075dbf15fe244855fc6e9fe48d07c6cc6c": {
        "Name": "tomcat03",
        "EndpointID": "794256f132edaf168c288ab62dc8901ca72f5067ba9989be65b80051f41e645c",
        "MacAddress": "02:42:ac:12:00:04",
        "IPv4Address": "172.18.0.4/16",
        "IPv6Address": ""
    },
    "c377bc23fd497612104d471ffa9eb7e53e2293696ee37a5331f3d9334491ae7e": {
        "Name": "tomcat02",
        "EndpointID": "e7cf220aa4d557445aaba89b3eca0dbb1cf72c7fafb46a70fe9d0be2bf447301",
        "MacAddress": "02:42:ac:12:00:02",
        "IPv4Address": "172.18.0.2/16",
        "IPv6Address": ""
    },
    "d25b287e98a04e4c1e3f3069f7f394c08a28daa24c2e2730bd8244942b5366fd": {
        "Name": "tomcat01",
        "EndpointID": "515ae218b10fcde3583ec2e5095f6fe1a2e18f1fd2e205977cbc20f1c2aabf3c",
        "MacAddress": "02:42:ac:12:00:03",
        "IPv4Address": "172.18.0.3/16",
        "IPv6Address": ""
    }
}

4. 進行目標容器的信息查看

4.1 這裏我們對容器tomcat03的信息進行查看

docker inspect tomcat03

裏面詳細的網絡設置,但是這些都不是關鍵,有興趣可以自己看看

"NetworkSettings": {
    "Bridge": "",
    "SandboxID": "7d133e35a8dbcfc525b8c1b47de56319351911f269e3c847b945f0fc83f9b343",
    "HairpinMode": false,
    "LinkLocalIPv6Address": "",
    "LinkLocalIPv6PrefixLen": 0,
    "Ports": {
        "8080/tcp": [
            {
                "HostIp": "0.0.0.0",
                "HostPort": "32772"
            }
        ]
    }
"Networks": {
    "bridge": {
        "IPAMConfig": null,
        "Links": null,
        "Aliases": null,
        "NetworkID": "b259290f477ebdc0eb8ac342d1b47a10c7d9bb937620b7c36b2e9f9cfa9b8385",
        "EndpointID": "794256f132edaf168c288ab62dc8901ca72f5067ba9989be65b80051f41e645c",
        "Gateway": "172.18.0.1",
        "IPAddress": "172.18.0.4",
        "IPPrefixLen": 16,
        "IPv6Gateway": "",
        "GlobalIPv6Address": "",
        "GlobalIPv6PrefixLen": 0,
        "MacAddress": "02:42:ac:12:00:04",
        "DriverOpts": null
    }
}

4.2 接下來可以看我們的tomcat03 執行–link後添加的設置

我們直接進入容器中的hosts文件查看域名配置

docker exec -it tomcat03 cat /etc/hosts

下面的是tomcat02就是這樣的配合

172.18.0.2      tomcat02 c377bc23fd49

下面是全部信息

[root@iZ2ze1ycujbqzy1mnrzufbZ ~]# docker exec -it tomcat03 cat /etc/hosts
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.18.0.2      tomcat02 c377bc23fd49
172.18.0.4      774766747fbc

5. 小結

我們通過–link配置的網絡實質上就是在tomcat03的容器中的hosts文件中添加了一條靜態的配置。
我們是不推薦這樣的配置的,我們更加推薦的是使用自定義網絡


高階:Docker Docker自定義網絡

1. Docker的網絡模式

bridge : 橋接模式(默認)
none : 不配置網絡
host : 和宿主機共享網絡
container : 容器網絡連通(用的少!侷限大)

2. 命令

2.1 默認使用docker0網絡,並且網絡模式就是橋接模式

docker run -d -P --name tomcat01 tomcat
docker run -d -P --name tomcat01 --net bridge tomcat

2.2 自定義一個網絡

命令參數

Usage:  docker network create [OPTIONS] NETWORK

下面是我們通常必須配置的參數
    1.網絡模式
    2.網關
    3.子網掩碼

Options:
  --driver string        Driver to manage the Network (default "bridge")
  --gateway strings      IPv4 or IPv6 Gateway for the master subnet
  --subnet strings       Subnet in CIDR format that represents a network segment
    ...

示例

docker network create \
--driver bridge \
--subnet 192.168.0.0/16 \
--gateway 192.168.0.1 \
mynet

查看我們的網絡信息

docker network ls
[root@iZ2ze1ycujbqzy1mnrzufbZ ~]# docker network create \
> --driver bridge \
> --subnet 192.168.0.0/16 \
> --gateway 192.168.0.1 \
> mynet
48f9fe343fd1d1c49ae40f7d9fdb069687ed00be34c8cbca2da7ee21cf867ef5
[root@iZ2ze1ycujbqzy1mnrzufbZ ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
b259290f477e        bridge              bridge              local
48e7078f2a8f        host                host                local
# 這個是我們新添加的自定義網絡
48f9fe343fd1        mynet               bridge              local
368354496e72        none                null                local

3. 我們進行測試

3.1 啓動我們的容器

docker run -d -P --name tomcat-net-01 --net mynet tomcat
docker run -d -P --name tomcat-net-02 --net mynet tomcat

3.2 查看網絡信息

docker network inspect mynet

可以看到在這個網絡裏面多了兩個我們剛剛啓動的容器信息

"Containers": {
    "2eaa3d1c0846893f55b05324f42e41a0c1e40c4fcf5822b23923c3342bc19ae5": {
        "Name": "tomcat-net-01",
        "EndpointID": "45e5f31ad6d2246795bfe17e29bdfec668c340890479ae114abc849f4f0be227",
        "MacAddress": "02:42:c0:a8:00:02",
        "IPv4Address": "192.168.0.2/16",
        "IPv6Address": ""
    },
    "dedc8ffc6ae2c91f684dd80efa5b315e093caf0fca267ff490e72dae4a01680d": {
        "Name": "tomcat-net-02",
        "EndpointID": "b94a7f94d1c9762012582a8159ed404bd1ade39627be1b20d393a71e7374c62d",
        "MacAddress": "02:42:c0:a8:00:03",
        "IPv4Address": "192.168.0.3/16",
        "IPv6Address": ""
    }
}

3.3 進行容器間連接測試

通過ip進行測試

docker exec -it tomcat-net-01 ping 192.168.0.3

直接通過容器名稱進行測試

docker exec -it tomcat-net-01 ping tomcat-net-01

可以看到,兩種方式都是可以成功進行連接的

4. 小結

我們自定義的網絡docker都已經幫我們維護好了對應的關係,推薦我們平時使用這樣使用網絡。

好處:
redis-不同的集羣使用不同的網絡,保證集羣是安全和健康的
mysql-不同的集羣使用不同的網絡,保證集羣是安全和健康的


高階:Docker Docker打通網絡

如果兩個容器位於兩個不同的網絡上,那麼我們是不可以直接打通的,我們需要進行額外的配置纔可以讓不同網絡間的容器進行打通通信。

1. 未配置前進行打通測試

docker exec -it tomcat01 ping tomcat-net-01

由於這兩個容器所在的網絡不同,一個在docker0,一個在我們自定義的mynet,所以是無法ping通的

[root@iZ2ze1ycujbqzy1mnrzufbZ ~]# docker exec -it tomcat01 ping tomcat-net-01
ping: tomcat02: Name or service not known

2. 進行打通並且進行測試

2.1 使用打通命令

參數介紹

Usage:  docker network connect [OPTIONS] NETWORK CONTAINER

Connect a container to a network

Options:
      --alias strings           Add network-scoped alias for the container
      --driver-opt strings      driver options for the network
      --ip string               IPv4 address (e.g., 172.30.100.104)
      --ip6 string              IPv6 address (e.g., 2001:db8::33)
      --link list               Add link to another container
      --link-local-ip strings   Add a link-local address for the container

示例

docker network connect --help

執行連通命令之後我們查看,可以看到我們tomcat01加入到了我們的mynet網絡下面。
官方說明:這個就是一個網絡,兩個ip

[root@iZ2ze1ycujbqzy1mnrzufbZ ~]# docker network inspect mynet

"Containers": {
    "2eaa3d1c0846893f55b05324f42e41a0c1e40c4fcf5822b23923c3342bc19ae5": {
        "Name": "tomcat-net-01",
        "EndpointID": "45e5f31ad6d2246795bfe17e29bdfec668c340890479ae114abc849f4f0be227",
        "MacAddress": "02:42:c0:a8:00:02",
        "IPv4Address": "192.168.0.2/16",
        "IPv6Address": ""
    },
    # 這裏我們可以看到這裏添加了我們剛剛打通的容器配置,並且這個容器獲取了一個新的的ip也
    "d25b287e98a04e4c1e3f3069f7f394c08a28daa24c2e2730bd8244942b5366fd": {
        "Name": "tomcat01",
        "EndpointID": "c02f5062df7f5f1fd86a11d31c3d5675c0f62ca8d86193da28a295dcecd9f09a",
        "MacAddress": "02:42:c0:a8:00:04",
        "IPv4Address": "192.168.0.4/16",
        "IPv6Address": ""
    },
    "dedc8ffc6ae2c91f684dd80efa5b315e093caf0fca267ff490e72dae4a01680d": {
        "Name": "tomcat-net-02",
        "EndpointID": "b94a7f94d1c9762012582a8159ed404bd1ade39627be1b20d393a71e7374c62d",
        "MacAddress": "02:42:c0:a8:00:03",
        "IPv4Address": "192.168.0.3/16",
        "IPv6Address": ""
    }
}

2.2 進行測試

docker exec -it tomcat01 ping tomcat-net-01

可以看到我們可以ping通在不同網絡上的容器了

[root@iZ2ze1ycujbqzy1mnrzufbZ ~]# docker exec -it tomcat01 ping tomcat-net-01
PING tomcat-net-01 (192.168.0.2) 56(84) bytes of data.
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.098 ms

高階實戰:Docker Redis集羣搭建

1. 配置我們的自定義網絡(方便容器間的通信)

設置我們的子網掩碼,也就是確定了我們的網段。

docker network create redis --subnet 172.38.0.0/16
[root@iZ2ze1ycujbqzy1mnrzufbZ ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
457e4f323561        redis               bridge              local

2. 接着我們來創建我們的集羣

2.1 首先編寫腳本創建6個redis的配置文件,他們的端口號需要時不同的

for port in $(seq 1 6); \
do \
mkdir -p /mydata/redis/node-${port}/conf
cat << EOF >/mydata/redis/node-${port}/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.38.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done

結果展示

[root@iZ2ze1ycujbqzy1mnrzufbZ conf]# pwd
/mydata/redis/node-1/conf
[root@iZ2ze1ycujbqzy1mnrzufbZ conf]# cat redis.conf 
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.38.0.11
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes

2.2 接着我們開始搭建我們的集羣,創建我們的6個容器

for port in $(seq 1 6); \
do \
docker run -p 637${port}:6379 -p 1637${port}:16379 \
--name redis-${port} \
-v /mydata/redis/node-${port}/data:/data \
-v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.1${port} \
redis:5.0.9-alpine3.11 redis-server \
/etc/redis/redis.conf
done

運行我們的腳本,可以看到6個容器都是正常運行

[root@iZ2ze1ycujbqzy1mnrzufbZ redis]# for port in $(seq 1 6); \
> do \
> docker run -p 637${port}:6379 -p 1637${port}:16379 \
> --name redis-${port} \
> -v /mydata/redis/node-${port}/data:/data \
> -v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf \
> -d --net redis --ip 172.38.0.1${port} \
> redis:5.0.9-alpine3.11 redis-server \
> /etc/redis/redis.conf
> EOF
> done
Unable to find image 'redis:5.0.9-alpine3.11' locally
5.0.9-alpine3.11: Pulling from library/redis
cbdbe7a5bc2a: Pull complete 
dc0373118a0d: Pull complete 
cfd369fe6256: Pull complete 
3e45770272d9: Pull complete 
558de8ea3153: Pull complete 
a2c652551612: Pull complete 
Digest: sha256:83a3af36d5e57f2901b4783c313720e5fa3ecf0424ba86ad9775e06a9a5e35d0
Status: Downloaded newer image for redis:5.0.9-alpine3.11
2abec85ad545493fefdccb5511e050b1a12898894c9ec39b14bfa2685c7db51c
fd076c840ecca41209d5f5100034b4d28b21c220230b9a8f810cfeb6dd816cc3
91ae11219a6849e24aadc6a24a219b12cd1f8bd5fd8175c4bbd458b944fa279e
9380d6b90678b957d04fc74102742139d3796ba0d40cdf6fcf62619e371800f0
9c2fa0db86f0fa3075fbaf64329207f4b1060b1423229190cf70496d697e7a3e
170f6d90334d69a99bd9c3a9a8e58473b1803b9faa74614ff36a721f91d63c6b
[root@iZ2ze1ycujbqzy1mnrzufbZ redis]# docker ps
CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS              PORTS                                              NAMES
170f6d90334d        redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   5 seconds ago       Up 4 seconds        0.0.0.0:6376->6379/tcp, 0.0.0.0:16376->16379/tcp   redis-6
9c2fa0db86f0        redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   5 seconds ago       Up 4 seconds        0.0.0.0:6375->6379/tcp, 0.0.0.0:16375->16379/tcp   redis-5
9380d6b90678        redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   6 seconds ago       Up 5 seconds        0.0.0.0:6374->6379/tcp, 0.0.0.0:16374->16379/tcp   redis-4
91ae11219a68        redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   6 seconds ago       Up 5 seconds        0.0.0.0:6373->6379/tcp, 0.0.0.0:16373->16379/tcp   redis-3
fd076c840ecc        redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   7 seconds ago       Up 6 seconds        0.0.0.0:6372->6379/tcp, 0.0.0.0:16372->16379/tcp   redis-2
2abec85ad545        redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   8 seconds ago       Up 6 seconds        0.0.0.0:6371->6379/tcp, 0.0.0.0:16371->16379/tcp   redis-1

3. 接着開始配置我們的集羣

3.1 進入到我們的redis後臺進行集羣的配置

docker exec -it redis-1 /bin/sh

進行集羣的搭建和分片配置

redis-cli --cluster create \
172.38.0.11:6379 \
172.38.0.12:6379 \
172.38.0.13:6379 \
172.38.0.14:6379 \
172.38.0.15:6379 \
172.38.0.16:6379 \
--cluster-replicas 1

下面可以看到我們集羣配置成功

[root@iZ2ze1ycujbqzy1mnrzufbZ conf]# docker exec -it redis-1 /bin/sh
/data # ls
appendonly.aof  nodes.conf
/data # redis-cli --cluster create \
> 172.38.0.11:6379 \
> 172.38.0.12:6379 \
> 172.38.0.13:6379 \
> 172.38.0.14:6379 \
> 172.38.0.15:6379 \
> 172.38.0.16:6379 \
> --cluster-replicas 1
>>> Performing hash slots allocation on 6 nodes...
# 下面有3個主機,3個從機
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 172.38.0.15:6379 to 172.38.0.11:6379
Adding replica 172.38.0.16:6379 to 172.38.0.12:6379
Adding replica 172.38.0.14:6379 to 172.38.0.13:6379
M: 0ca28d74812a137dd8ff7e8c6eaaac12d7520ccf 172.38.0.11:6379
   slots:[0-5460] (5461 slots) master
M: ae4d8b65fe0b8abfa2f227919294d34600f0d4a9 172.38.0.12:6379
   slots:[5461-10922] (5462 slots) master
M: 6f93f69ce3ba15a58de143cf366dde1e14af184f 172.38.0.13:6379
   slots:[10923-16383] (5461 slots) master
S: 4875a8ead4d1e10c9fda0eca8c548a356ca34526 172.38.0.14:6379
   replicates 6f93f69ce3ba15a58de143cf366dde1e14af184f
S: 29e0f774e54778d7a28b8eb5c063d989b0f4ee19 172.38.0.15:6379
   replicates 0ca28d74812a137dd8ff7e8c6eaaac12d7520ccf
S: b158f37ff07946ee317f779d22171b5a8f8bb6cb 172.38.0.16:6379
   replicates ae4d8b65fe0b8abfa2f227919294d34600f0d4a9
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
...
>>> Performing Cluster Check (using node 172.38.0.11:6379)
M: 0ca28d74812a137dd8ff7e8c6eaaac12d7520ccf 172.38.0.11:6379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: 4875a8ead4d1e10c9fda0eca8c548a356ca34526 172.38.0.14:6379
   slots: (0 slots) slave
   replicates 6f93f69ce3ba15a58de143cf366dde1e14af184f
M: 6f93f69ce3ba15a58de143cf366dde1e14af184f 172.38.0.13:6379
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: b158f37ff07946ee317f779d22171b5a8f8bb6cb 172.38.0.16:6379
   slots: (0 slots) slave
   replicates ae4d8b65fe0b8abfa2f227919294d34600f0d4a9
S: 29e0f774e54778d7a28b8eb5c063d989b0f4ee19 172.38.0.15:6379
   slots: (0 slots) slave
   replicates 0ca28d74812a137dd8ff7e8c6eaaac12d7520ccf
M: ae4d8b65fe0b8abfa2f227919294d34600f0d4a9 172.38.0.12:6379
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

3.2 進行集羣的測試

3.2.1 首先簡單的啓動我們的集羣並且查看集羣的信息

首先我們啓動我們的redis,但是注意後面添加參數 -c ,表示我們啓動的方式是集羣啓動

./redis.sh -c

可以看到我們的集羣大小是3(cluster_size:3),並且有着6個節點(cluster_known_nodes:6)

/data # redis-cli -c
127.0.0.1:6379> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:897
cluster_stats_messages_pong_sent:882
cluster_stats_messages_sent:1779
cluster_stats_messages_ping_received:877
cluster_stats_messages_pong_received:897
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:1779

接着我們查看我們的節點信息
其中主節點:
0ca28d74812a137dd8ff7e8c6eaaac12d7520ccf 172.38.0.11:6379@16379 myself,master - 0 1592138733000 1 connected 0-5460
ae4d8b65fe0b8abfa2f227919294d34600f0d4a9 172.38.0.12:6379@16379 master - 0 1592138735255 2 connected 5461-10922
6f93f69ce3ba15a58de143cf366dde1e14af184f 172.38.0.13:6379@16379 master - 0 1592138734000 3 connected 10923-16383
其中從節點:
29e0f774e54778d7a28b8eb5c063d989b0f4ee19 172.38.0.15:6379@16379 slave 0ca28d74812a137dd8ff7e8c6eaaac12d7520ccf 0 1592138734252 5 connected
b158f37ff07946ee317f779d22171b5a8f8bb6cb 172.38.0.16:6379@16379 slave ae4d8b65fe0b8abfa2f227919294d34600f0d4a9 0 1592138734553 6 connected
4875a8ead4d1e10c9fda0eca8c548a356ca34526 172.38.0.14:6379@16379 slave 6f93f69ce3ba15a58de143cf366dde1e14af184f 0 1592138734000 4 connected

127.0.0.1:6379> cluster nodes
0ca28d74812a137dd8ff7e8c6eaaac12d7520ccf 172.38.0.11:6379@16379 myself,master - 0 1592138733000 1 connected 0-5460
6f93f69ce3ba15a58de143cf366dde1e14af184f 172.38.0.13:6379@16379 master - 0 1592138734000 3 connected 10923-16383
ae4d8b65fe0b8abfa2f227919294d34600f0d4a9 172.38.0.12:6379@16379 master - 0 1592138735255 2 connected 5461-10922
4875a8ead4d1e10c9fda0eca8c548a356ca34526 172.38.0.14:6379@16379 slave 6f93f69ce3ba15a58de143cf366dde1e14af184f 0 1592138734000 4 connected
b158f37ff07946ee317f779d22171b5a8f8bb6cb 172.38.0.16:6379@16379 slave ae4d8b65fe0b8abfa2f227919294d34600f0d4a9 0 1592138734553 6 connected
29e0f774e54778d7a28b8eb5c063d989b0f4ee19 172.38.0.15:6379@16379 slave 0ca28d74812a137dd8ff7e8c6eaaac12d7520ccf 0 1592138734252 5 connected

3.2.2 接着我們進行集羣的高可用測試

先存入一個key,可以看到是主節點172.38.0.13:6379@16379 master進行了存儲,也就是我們的容器 redis-3

127.0.0.1:6379> set key01 value01
-> Redirected to slot [13770] located at 172.38.0.13:6379
OK
172.38.0.13:6379> get key01
"value01"

接着我們關閉這個redis來模擬這個redis服務器的崩塌,然後驗證是否能夠在其從容器中查找到剛剛的key01

[root@iZ2ze1ycujbqzy1mnrzufbZ data]# docker ps
CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS              PORTS                                              NAMES
b526ad9d30ac        redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   19 minutes ago      Up 19 minutes       0.0.0.0:6376->6379/tcp, 0.0.0.0:16376->16379/tcp   redis-6
dba2cd610a45        redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   19 minutes ago      Up 19 minutes       0.0.0.0:6375->6379/tcp, 0.0.0.0:16375->16379/tcp   redis-5
2bc5977b1db3        redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   19 minutes ago      Up 19 minutes       0.0.0.0:6374->6379/tcp, 0.0.0.0:16374->16379/tcp   redis-4
89f9f9dabae3        redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   19 minutes ago      Up 19 minutes       0.0.0.0:6373->6379/tcp, 0.0.0.0:16373->16379/tcp   redis-3
4858e1cf270a        redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   19 minutes ago      Up 19 minutes       0.0.0.0:6372->6379/tcp, 0.0.0.0:16372->16379/tcp   redis-2
cf810826f5a1        redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   19 minutes ago      Up 19 minutes       0.0.0.0:6371->6379/tcp, 0.0.0.0:16371->16379/tcp   redis-1
[root@iZ2ze1ycujbqzy1mnrzufbZ data]# docker stop redis-3
redis-3
[root@iZ2ze1ycujbqzy1mnrzufbZ data]# docker ps
CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS              PORTS                                              NAMES
b526ad9d30ac        redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   19 minutes ago      Up 19 minutes       0.0.0.0:6376->6379/tcp, 0.0.0.0:16376->16379/tcp   redis-6
dba2cd610a45        redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   19 minutes ago      Up 19 minutes       0.0.0.0:6375->6379/tcp, 0.0.0.0:16375->16379/tcp   redis-5
2bc5977b1db3        redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   19 minutes ago      Up 19 minutes       0.0.0.0:6374->6379/tcp, 0.0.0.0:16374->16379/tcp   redis-4
4858e1cf270a        redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   19 minutes ago      Up 19 minutes       0.0.0.0:6372->6379/tcp, 0.0.0.0:16372->16379/tcp   redis-2
cf810826f5a1        redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   19 minutes ago      Up 19 minutes       0.0.0.0:6371->6379/tcp, 0.0.0.0:16371->16379/tcp   redis-1

可以看到我們從172.38.0.14:6379@16379 slave 中命中了目標數據,可以看到集羣實現了高可用

/data # redis-cli -c
127.0.0.1:6379> get key01
-> Redirected to slot [13770] located at 172.38.0.14:6379
"value01"

這裏我們再次查看節點信息,可以看到一個節點崩了,於是另外一個從節點成爲主機進行運作
4875a8ead4d1e10c9fda0eca8c548a356ca34526 172.38.0.14:6379@16379 master - 0 1592139698552 7 connected 10923-16383
6f93f69ce3ba15a58de143cf366dde1e14af184f 172.38.0.13:6379@16379 master,fail - 1592139388313 1592139385809 3 connected

127.0.0.1:6379> cluster nodes
4875a8ead4d1e10c9fda0eca8c548a356ca34526 172.38.0.14:6379@16379 master - 0 1592139698552 7 connected 10923-16383
6f93f69ce3ba15a58de143cf366dde1e14af184f 172.38.0.13:6379@16379 master,fail - 1592139388313 1592139385809 3 connected
0ca28d74812a137dd8ff7e8c6eaaac12d7520ccf 172.38.0.11:6379@16379 myself,master - 0 1592139698000 1 connected 0-5460
b158f37ff07946ee317f779d22171b5a8f8bb6cb 172.38.0.16:6379@16379 slave ae4d8b65fe0b8abfa2f227919294d34600f0d4a9 0 1592139699000 6 connected
29e0f774e54778d7a28b8eb5c063d989b0f4ee19 172.38.0.15:6379@16379 slave 0ca28d74812a137dd8ff7e8c6eaaac12d7520ccf 0 1592139699554 5 connected
ae4d8b65fe0b8abfa2f227919294d34600f0d4a9 172.38.0.12:6379@16379 master - 0 1592139698652 2 connected 5461-10922

命令總結

鏡像命令


docker images                                # 查看鏡像詳細信息
docker images -q                             # 僅僅查看鏡像id
docker search mysql --filter=STARS=3000      # 查找STARTS > 3000 的mysql
docker pull mysql:5.7
docker rmi -f be0dbf01a0f3 bf756fb1ae65      # 刪除指定id鏡像
docker rmi -f $(docker images -aq)           # 刪除所有鏡像
docker run -it centos:7                      # 從鏡像常見一個容器並且執行 

後臺運行

docker run \
-d \
-p 8080:8080 \
-v container01 \
-e 環境變量 \
容器id|容器name

前臺運行

docker run \
-it \
-p 8080:8080 \
-v container01 \
-e 環境變量 \
容器id|容器name \
/bin/bash

容器命令


docker ps                                    # 列出正在執行的容器
docker ps -a                                 # 列出所有容器,包括沒有執行的
exit                                         # 退出當前容器,後臺不再運行
Ctrl + P + Q                                 # 退出當前容器,後臺繼續運行
docker rm 79496fc1a948                       # 刪除指定id容器
docker rm -f $(docker ps -aq)                # 刪除所有容器
docker start f81027372ded                    # 下面是一些通過容器id進行執行的命令
docker restart f81027372ded
docker stop f81027372ded
docker kill f81027372ded
docker run -d centos                            # 後臺打開容器,但是如果沒有前臺程序執行的話可能會直接退出
docker run -d centos /bin/sh -c "while true;do echo centos is running;sleep 1;done"     # 後臺運行容器並且爲其指定前臺
docker logs -tf --tail 10 f81027372ded          # 進行日誌的打印
docker exec -it 28cf2fa3a0bb /bin/bash          # 打開目標容器新的命令窗口
docker attach 28cf2fa3a0bb                      # 執行已經容器中已經運行的命令窗口

後臺運行並且制定前臺程序

docker run \
-d centos \
/bin/sh -c "while true;do echo centos is running;sleep 1;done"

容器同步命令


docker cp 28cf2fa3a0bb:/home/test.java /home    # 複製容器中的文件到本地

具名數據卷

docker run \
-it \
-p 8080:8080 \
-v container01:/ \
-e 環境變量 \
容器id|容器name \
/bin/bash

全路徑數據卷

docker run \
-it \
-p 8080:8080 \
-v /mymetadata/data:/ \
-e 環境變量 \
容器id|容器name \
/bin/bash

容器數據分卷命令


數據分卷目錄

/var/lib/docker/volumes 
docker volume ls                # 查看所有數據卷
docker volume inspect ngnix     # 查看指定鏡像的數據卷的詳細信息
docker inspect a14ef03845bf     # 查看容器數據卷信息

Docker網絡命令


docker network ls
docker network inspect 網絡id|網絡name

創建自定義ip

docker network create \
--driver bridge \
--subnet 192.168.0.0/16 \
--gateway 192.168.0.1/16 \
網絡name

通過自定義網絡啓動images

docker run -d -P --name tomcat01 --net bridge tomcat

進行ping測試

docker exec -it tomcat-net-01 ping 192.168.0.3

不同網絡的容器間打印

docker exec -it tomcat01 ping tomcat-net-01

常見軟件啓動


tomcat具體分卷

docker run \
--name tomcat \
-d \
-v tomcat8080conf:/usr/local/tomcat/conf \
-v tomcat8080webapps:/usr/local/tomcat/webapps \
-p 8080:8080 \
tomcat:9.0 

nginx具體分卷

docker run \
    --name nginx01 \
    -d  \  
    -p  80:80 \
    -v ngnix:/etc/nginx \
    nginx

MySQL具體分卷

 docker run \
 --name mymysql01 \
 -v mysqlconf:/etc/mysql/conf.d \
 -v mysqldata:/var/lib/mysql \
 -e MYSQL_ROOT_PASSWORD=root \
 -d \
 -p 3306:3306 \
 mysql:5.7

elasticsearch啓動

docker run 
--name elasticsearch02 \
-d \
-p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms64m -Xmx512m" \
elasticsearch:7.7.1

Dockerfile命令


docker build -f mytomcat -t mytomcat8080 .
# 我們的基礎鏡像
FROM centos
# 我們的作者
MAINTAINER root<73@qq.com>
# 拷貝我們的文件到鏡像中
COPY readme.txt /usr/local/readme.txt
# 添加我們的文件並且會自動解壓到容器中的目標目錄
ADD apache-tomcat-9.0.36.tar.gz /usr/local
ADD jdk-8u151-linux-x64.tar.gz /usr/local
# 環境變量
ENV MYPATH /usr/local
# 鏡像的工作目錄
WORKDIR $MYPATH
# 配置我們的環境
ENV JAVA_HOME /usr/local/jdk1.8.0_151
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.36
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.36
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
# 鏡像構建的時候需要運行的命令,這裏安裝vim和網絡插件
RUN yum -y install vim
RUN yum -y install net-tools
# 設置暴露的端口
EXPOSE 8080
# 指定這個容器啓動的時候需要運行的命令
CMD echo $MYPATH
CMD /usr/local/apache-tomcat-9.0.36/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.36/bin/logs/catalina.out


小結:我的Docker網址整理

最後,希望大家點個贊。給博主充充電!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章