Docker学习笔记--基础及进阶

Docker基础篇

1 概述

一句话概括容器:容器就是将软件打包成标准化单元,以用于开发、交付和部署。

  • 容器镜像是轻量的、可执行的独立软件包 ,包含软件运行所需的所有内容:代码、运行时环境、系统工具、系统库和设置。
  • 容器化软件适用于基于 Linux 和 Windows 的应用,在任何环境中都能够始终如一地运行。
  • 容器赋予了软件独立性,使其免受外在环境差异(例如,开发和预演环境的差异)的影响,从而有助于减少团队间在相同基础设施上运行不同软件时的冲突。
    如果需要通俗地描述容器的话,我觉得容器就是一个存放东西的地方,就像书包可以装各种文具、衣柜可以放各种衣服、鞋架可以放各种鞋子一样。我们现在所说的容器存放的东西可能更偏向于应用比如网站、程序甚至是系统环境。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pJBe0tcr-1666578463192)(https://cdn.jsdelivr.net/gh/WEXIAWANG/PicGo_Store@main/img/20220411205227.png)]

2 虚拟化技术和容器化技术

2.1 虚拟化技术

首先,Docker 容器虚拟化技术为基础的软件,那么什么是虚拟化技术呢?

简单点来说,虚拟化技术可以这样定义:

虚拟化技术是一种资源管理技术,是将计算机的各种实体资源(CPU、内存、磁盘空间、网络适配器等),予以抽象、转换后呈现出来并可供分割、组合为一个或多个电脑配置环境。由此,打破实体结构间的不可切割的障碍,使用户可以比原本的配置更好的方式来应用这些电脑硬件资源。这些资源的新虚拟部分是不受现有资源的架设方式,地域或物理配置所限制。一般所指的虚拟化资源包括计算能力和数据存储。

2.2 Docker 基于 LXC 虚拟容器技术

Docker 技术是基于 LXC(Linux container- Linux 容器)虚拟容器技术的。

LXC,其名称来自 Linux 软件容器(Linux Containers)的缩写,一种操作系统层虚拟化(Operating system–level virtualization)技术,为 Linux 内核容器功能的一个用户空间接口。它将应用软件系统打包成一个软件容器(Container),内含应用软件本身的代码,以及所需要的操作系统核心和库。通过统一的名字空间和共用 API 来分配不同软件容器的可用硬件资源,创造出应用程序的独立沙箱运行环境,使得 Linux 用户可以容易的创建和管理系统或应用容器。

LXC 技术主要是借助 Linux 内核中提供的 CGroup 功能和 name space 来实现的,通过 LXC 可以为软件提供一个独立的操作系统运行环境。

cgroup 和 namespace 介绍:

  • namespace 是 Linux 内核用来隔离内核资源的方式。 通过 namespace 可以让一些进程只能看到与自己相关的一部分资源,而另外一些进程也只能看到与它们自己相关的资源,这两拨进程根本就感觉不到对方的存在。具体的实现方式是把一个或多个进程的相关资源指定在同一个 namespace 中。Linux namespaces 是对全局系统资源的一种封装隔离,使得处于不同 namespace 的进程拥有独立的全局系统资源,改变一个 namespace 中的系统资源只会影响当前 namespace 里的进程,对其他 namespace 中的进程没有影响。
  • CGroup 是 Control Groups 的缩写,是 Linux 内核提供的一种可以限制、记录、隔离进程组 (process groups) 所使用的物力资源 (如 cpu memory i/o 等等) 的机制。

cgroup 和 namespace 两者对比:

两者都是将进程进行分组,但是两者的作用还是有本质区别。namespace 是为了隔离进程组之间的资源,而 cgroup 是为了对一组进程进行统一的资源监控和限制。

3 Docker基本组成

Docker 中有非常重要的三个基本概念,理解了这三个概念,就理解了 Docker 的整个生命周期。

  • 镜像(Image)
  • 容器(Container)
  • 仓库(Repository)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pdXYJaAV-1666578463200)(https://cdn.jsdelivr.net/gh/WEXIAWANG/PicGo_Store@main/img/20220411205423.png)]

4 Docker安装

4.1 查看系统内核和系统信息

命令:

uname -r     #查看系统内核版本
cat /etc/os-release  #查看系统版本
[root@iZ1608aqb7ntn9Z /]# uname -r
4.18.0-193.14.2.el8_2.x86_64
[root@iZ1608aqb7ntn9Z /]# cat /etc/os-release
NAME="CentOS Linux"
VERSION="8 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="8"
PLATFORM_ID="platform:el8"
PRETTY_NAME="CentOS Linux 8 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:8"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-8"
CENTOS_MANTISBT_PROJECT_VERSION="8"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="8"

4.2 开始安装Docker

4.2.1 卸载旧版本
yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
[root@iZ1608aqb7ntn9Z /]# yum remove docker \
>                   docker-client \
>                   docker-client-latest \
>                   docker-common \
>                   docker-latest \
>                   docker-latest-logrotate \
>                   docker-logrotate \
>                   docker-engine
No match for argument: docker
No match for argument: docker-client
No match for argument: docker-client-latest
No match for argument: docker-common
No match for argument: docker-latest
No match for argument: docker-latest-logrotate
No match for argument: docker-logrotate
No match for argument: docker-engine
没有软件包需要移除。
依赖关系解决。
无需任何处理。
完毕!
4.2.2 下载依赖安装包
yum install -y yum-utils
4.2.3 配置镜像仓库
#国外的地址
yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo  
    
# 设置阿里云的Docker镜像仓库
yum-config-manager \
    --add-repo \
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@iZ1608aqb7ntn9Z /]# yum-config-manager \
     --add-repo \
     https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
     添加仓库自:https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.rep
4.2.4 更新yum软件包
yum makecache fast
4.2.5 下载docker
yum install docker-ce docker-ce-cli containerd.io   # 安装社区版
yum install docker-ee docker-ee-cli containerd.io   # 安装企业版

4.3 启动Docker

systemctl start docker   # 启动Docker
docker version           # 查看当前版本号,是否启动成功
systemctl enable docker  # 设置开机自启动
[root@iZ1608aqb7ntn9Z /]# systemctl start docker
[root@iZ1608aqb7ntn9Z /]# docker version
Client: Docker Engine - Community
 Version:           20.10.7
 API version:       1.41
 Go version:        go1.13.15
 Git commit:        f0df350
 Built:             Wed Jun  2 11:56:24 2021
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.7
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.13.15
  Git commit:       b0f5bc3
  Built:            Wed Jun  2 11:54:48 2021
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.4.9
  GitCommit:        e25210fe30a0a703442421b0f60afac609f950a3
 runc:
  Version:          1.0.1
  GitCommit:        v1.0.1-0-g4144b63
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

4.4 Docker的HelloWorld

命令:

docker run hello-world
[root@iZ1608aqb7ntn9Z /]# docker run hello-world
Unable to find image 'hello-world:latest' locally  # 本地没有
latest: Pulling from library/hello-world           # pull一个最新版
b8dfde127a29: Pull complete                        # pull成功
Digest: sha256:df5f5184104426b65967e016ff2ac0bfcd44ad7899ca3bbcf8e44e4461491a9e
Status: Downloaded newer image for hello-world:latest

Hello from Docker!                                 # 运行结果
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

5 Docker卸载

yum remove docker-ce docker-ce-cli containerd.io  # 卸载依赖
rm -rf /var/lib/docker    # 删除资源  . /var/lib/docker是docker的默认工作路径

6 配置阿里云镜像

6.1 进入阿里云官网,搜索容器镜像服务

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YQKAixaP-1666578463202)(https://cdn.jsdelivr.net/gh/WEXIAWANG/PicGo_Store@main/img/20220411205730.png)]

6.2 执行命令

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://axvfsf7e.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

7 Docker运行流程和原理

7.1 启动流程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ABcR272I-1666578463203)(https://cdn.jsdelivr.net/gh/WEXIAWANG/PicGo_Store@main/img/20220411205758.png)]

7.2 运行原理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8aLVzOOf-1666578463205)(https://cdn.jsdelivr.net/gh/WEXIAWANG/PicGo_Store@main/img/20220411205811.png)]

7.3 Docker整体架构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fH63yRXh-1666578463207)(https://cdn.jsdelivr.net/gh/WEXIAWANG/PicGo_Store@main/img/20220411205827.png)]

8 Docker常用命令

命令的帮助文档地址:https://docs.docker.com/engine/reference/commandline/docker/

8.1 基本命令

docker version          #查看docker的版本信息
docker info             #查看docker的系统信息,包括镜像和容器的数量
docker 命令 --help       #帮助命令(可查看可选的参数)
docker COMMAND --help
[root@iZ1608aqb7ntn9Z /]# docker info
Client:
 Context:    default
 Debug Mode: false
 Plugins:
  app: Docker App (Docker Inc., v0.9.1-beta3)
  buildx: Build with BuildKit (Docker Inc., v0.5.1-docker)
  scan: Docker Scan (Docker Inc., v0.8.0)
Server:
 Containers: 1
  Running: 0
  Paused: 0
  Stopped: 1
 Images: 1
 Server Version: 20.10.7
......

8.2 镜像命令

8.2.1 docker images 查看本地主机的所有镜像
[root@iZ1608aqb7ntn9Z /]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world   latest    d1165f221234   5 months ago   13.3kB
# 解释:
1.REPOSITORY  镜像的仓库源
2.TAG  镜像的标签
3.IMAGE ID 镜像的id
4.CREATED 镜像的创建时间
5.SIZE 镜像的大小
# 可选参数
-a/--all 列出所有镜像
-q/--quiet 只显示镜像的id
8.2.2 docker search 搜索镜像

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4IRBuMzS-1666578463209)(https://cdn.jsdelivr.net/gh/WEXIAWANG/PicGo_Store@main/img/20220411205921.png)]

#可选参数
Search the Docker Hub for images
Options:
  -f, --filter filter   Filter output based on conditions provided
      --format string   Pretty-print search using a Go template
      --limit int       Max number of search results (default 25)
      --no-trunc        Don't truncate output
            
#搜索收藏数大于3000的镜像
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker search mysql --filter=STARS=3000
NAME      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql     MySQL is a widely used, open-source relation…   10308     [OK]
mariadb   MariaDB is a community-developed fordockerk of MyS…   3819      [OK]
8.2.3 docker pull 镜像名[:tag] 下载镜像
[root@iZ1608aqb7ntn9Z /]# docker pull mysql:5.7
5.7: Pulling from library/mysql
33847f680f63: Pull complete 
5cb67864e624: Pull complete 
1a2b594783f5: Pull complete 
b30e406dd925: Pull complete 
48901e306e4c: Pull complete 
603d2b7147fd: Pull complete 
802aa684c1c4: Pull complete 
5b5a19178915: Pull complete 
f9ce7411c6e4: Pull complete 
f51f6977d9b2: Pull complete 
aeb6b16ce012: Pull complete 
Digest: sha256:be70d18aedc37927293e7947c8de41ae6490ecd4c79df1db40d1b5b5af7d9596
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
8.2.4 docker rmi 删除镜像
#1.删除指定的镜像id
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker rmi -f  镜像id
#2.删除多个镜像id
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker rmi -f  镜像id 镜像id 镜像id
#3.删除全部的镜像id
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker rmi -f  $(docker images -aq)

8.3 容器命令

8.3.1 docker run [可选参数] image 运行容器
docker run [可选参数] image

#参数说明
--name="名字"           指定容器名字
-d                     后台方式运行
-it                    使用交互方式运行,进入容器查看内容
-p                     指定容器的端口
( -p ip:主机端口:容器端口  配置主机端口映射到容器端口
  -p 主机端口:容器端口
  -p 容器端口)
-P                     随机指定端口(大写的P)
[root@iZ1608aqb7ntn9Z /]# docker run 8cf625070931
2021-08-03 06:48:07+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.35-1debian10 started.
2021-08-03 06:48:07+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2021-08-03 06:48:07+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.35-1debian10 started.
2021-08-03 06:48:07+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified
    You need to specify one of the following:
    - MYSQL_ROOT_PASSWORD
    - MYSQL_ALLOW_EMPTY_PASSWORD
    - MYSQL_RANDOM_ROOT_PASSWORD
8.3.2 进入容器
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker run -it [容器ID] /bin/bash
8.3.3 exit 退出容器
#exit 停止并退出容器(后台方式运行则仅退出)
#Ctrl+P+Q  不停止容器退出
[root@bd1b8900c547 /]# exit
exit
[root@iZwz99sm8v95sckz8bd2c4Z ~]#
8.3.4 docker ps列出容器
#docker ps 
     # 列出当前正在运行的容器
-a   # 列出所有容器的运行记录
-n=? # 显示最近创建的n个容器
-q   # 只显示容器的编号


[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND       CREATED         STATUS                     PORTS     NAMES
bca129320bb5   centos         "/bin/bash"   4 minutes ago   Exited (0) 3 minutes ago             optimistic_shtern
bd1b8900c547   centos         "/bin/bash"   6 minutes ago   Exited (0) 5 minutes ago             cool_tesla
cf6adbf1b506   bf756fb1ae65   "/hello"      5 hours ago     Exited (0) 5 hours ago               optimistic_darwin
8.3.5 删除容器
docker rm 容器id                 #删除指定的容器,不能删除正在运行的容器,强制删除使用 rm -f
docker rm -f $(docker ps -aq)   #删除所有的容器
docker ps -a -q|xargs docker rm #删除所有的容器
8.3.6 启动和重启容器命令
docker start 容器id          #启动容器
docker restart 容器id        #重启容器
docker stop 容器id           #停止当前运行的容器
docker kill 容器id           #强制停止当前容器
# 命令 docker run -d 镜像名
[root@xx /] # docker run -d centos

# 问题docker ps,发现centos停止了

# 常见的坑,docker 容器使用后台运行,就必须要有一个前台进程,docker发现没有进程,就会自动停止

# nginx,容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了

8.4 其他命令

8.4.1 查看日志
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker logs --help

Usage:  docker logs [OPTIONS] CONTAINER

Fetch the logs of a container

Options:
      --details        Show extra details provided to logs
  -f, --follow         Follow log output
      --since string   Show logs since timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)
  -n, --tail string    Number of lines to show from the end of the logs (default "all")
  -t, --timestamps     Show timestamps
      --until string   Show logs before a timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)

常用:
docker logs -tf 容器id
docker logs --tail number 容器id #num为要显示的日志条数


#docker容器后台运行,必须要有一个前台的进程,否则会自动停止

#编写shell脚本循环执行,使得centos容器保持运行状态

[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker run -d centos /bin/sh -c "while true;do echo hi;sleep 5;done"
c703b5b1911ff84d584390263a35707b6024816e1f46542b61918a6327a570dc
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
c703b5b1911f   centos    "/bin/sh -c 'while t…"   13 seconds ago   Up 10 seconds             pedantic_banach
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker logs -tf --tail 10 c703b5b1911f
2020-12-27T03:34:07.255599560Z hi
2020-12-27T03:34:12.257641517Z hi
2020-12-27T03:34:17.259706294Z hi
2020-12-27T03:34:22.261693707Z hi
2020-12-27T03:34:27.262609289Z hi
2020-12-27T03:34:32.267862677Z hi
2020-12-27T03:34:37.270382873Z hi
2020-12-27T03:34:42.272414182Z hi
2020-12-27T03:34:47.274823243Z hi
2020-12-27T03:34:52.277419274Z hi
8.4.2 查看容器中进程信息
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker top c703b5b1911f
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                11156               11135               0                   11:31               ?                   00:00:00            /bin/sh -c while true;do echo hi;sleep 5;done
root                11886               11156               0                   11:43               ?                   00:00:00            /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 5
8.4.3 查看容器的元数据
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker inspect 容器id
8.4.4 进入当前正在运行的容器
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker exec -it c703b5b1911f /bin/bash
[root@c703b5b1911f /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@c703b5b1911f /]# ps -ef      
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 03:31 ?        00:00:00 /bin/sh -c while true;do echo hi;sleep 5;done
root       279     0  0 03:54 pts/0    00:00:00 /bin/bash
root       315     1  0 03:56 ?        00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 5
root       316   279  0 03:56 pts/0    00:00:00 ps -ef
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker attach c703b5b1911f

docker exec 进入容器后开启一个新的终端,可以在里面操作

docker attach 进入容器正在执行的终端,不会启动新的进程

8.4.5 拷贝容器文件到主机

拷贝容器的文件到主机中

docker cp 容器id:容器内路径 目的主机路径
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker exec -it c703b5b1911f /bin/bash
[root@c703b5b1911f /]# cd home
[root@c703b5b1911f home]# ls
#touch 新建文件
[root@c703b5b1911f home]# touch test.java
[root@c703b5b1911f home]# ls
test.java
[root@c703b5b1911f home]# exit
exit
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
c703b5b1911f   centos    "/bin/sh -c 'while t…"   35 minutes ago   Up 35 minutes             pedantic_banach
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker cp c703b5b1911f:/home/test.java /home
[root@iZwz99sm8v95sckz8bd2c4Z ~]# ls /home
hai  pan  test.java

8.5 常用命令小结

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NEkYjW4Z-1666578463210)(https://cdn.jsdelivr.net/gh/WEXIAWANG/PicGo_Store@main/img/20220411210319.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sYyPsSmJ-1666578463212)(https://cdn.jsdelivr.net/gh/WEXIAWANG/PicGo_Store@main/img/20220412153937.png)]

9 Docker图形化管理工具

9.1 Docker UI

docker search dockerui
docker pull abh1nav/dockerui
docker run -d --privileged --name dockerui -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock abh1nav/dockerui  
#放开物理机的9000端口对应Docker容器的9000端口
[root@iZ1608aqb7ntn9Z /]# docker search dockerui
NAME                           DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
abh1nav/dockerui               An updated version of crosbymichael/dockerui…   99                   [OK]
kevan/dockerui                 Deprecated: Use  uifd/ui-for-docker             15                   [OK]
microbox/dockerui              Trusted Automated dockerui image (16MB size)    8               ......
[root@iZ1608aqb7ntn9Z /]# docker pull abh1nav/dockerui
Using default tag: latest
latest: Pulling from abh1nav/dockerui
Image docker.io/abh1nav/dockerui:latest uses outdated schema1 manifest format. Please upgrade to a schema2 image for better future compatibility. More information at https://docs.docker.com/registry/spec/deprecated-schema-v1/
a3ed95caeb02: Pull complete 
5d3df020ecd3: Pull complete 
bebf5a3b4dfb: Pull complete 
e4452c0fe72b: Pull complete 
6167d9726b07: Pull complete 
53ebae19a314: Pull complete 
Digest: sha256:a9c6c5393f561a0f42f41cfa80572b666e745d9b419569c42bac1e5cf9ceda32
Status: Downloaded newer image for abh1nav/dockerui:latest
docker.io/abh1nav/dockerui:latest
[root@iZ1608aqb7ntn9Z /]#  docker run -d --privileged --name dockerui -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock abh1nav/dockerui
e2352bcf98475e17e4d25cd2f30324c4bd1465927b2452126c94d03052a11c91

使用:访问:http://ip地址:9000

9.2 Shipyard

集群管理平台

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b5K0lFMv-1666578463214)(https://cdn.jsdelivr.net/gh/WEXIAWANG/PicGo_Store@main/img/20220412091434.png)]

9.3 Portainer

Docker的图形化界面管理工具

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1zEp6XAT-1666578463215)(https://cdn.jsdelivr.net/gh/WEXIAWANG/PicGo_Store@main/img/20220412091513.png)]

docker search portainer
docker pull portainer/portainer
docker run -d --name portainerUI -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer
[root@iZ1608aqb7ntn9Z /]# docker search portainer
NAME                             DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
portainer/portainer              This Repo is now deprecated, use portainer/p…   2109                 
portainer/portainer-ce           Portainer CE - Making Docker and Kubernetes …   635                  
portainer/agent                  An agent used to manage all the resources in…   111                  
portainer/templates              App Templates for Portainer http://portainer…   23             ......                  
[root@iZ1608aqb7ntn9Z /]# docker pull portainer/portainer
Using default tag: latest
latest: Pulling from portainer/portainer
94cfa856b2b1: Pull complete 
49d59ee0881a: Pull complete 
a2300fd28637: Pull complete 
Digest: sha256:fb45b43738646048a0a0cc74fcee2865b69efde857e710126084ee5de9be0f3f
Status: Downloaded newer image for portainer/portainer:latest
docker.io/portainer/portainer:latest
[root@iZ1608aqb7ntn9Z /]# docker run -d --name portainerUI -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer
abbf483bd3df0e30eaeb3a0dd708776a6fbbf055e2c87bcb84177df7e86c8ac2

10 常见容器部署—Nginx,Tomcat,ES

10.1 Nginx

[root@iZ1608aqb7ntn9Z ~]# docker search nginx  # 查找
[root@iZ1608aqb7ntn9Z ~]# docker pull nginx    # 下载
[root@iZ1608aqb7ntn9Z ~]# docker run -d --name nginx -p 9000:80 nginx   # 启动

# 备注
-d 后台运行
--name 给容器命名
-p 3334:80 将宿主机的端口3334映射到该容器的80端口
[root@iZ1608aqb7ntn9Z ~]# docker search nginx
NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
nginx                             Official build of Nginx.                        15256     [OK]       
jwilder/nginx-proxy               Automated Nginx reverse proxy for docker con…   2054                 [OK]
richarvey/nginx-php-fpm           Container running Nginx + PHP-FPM capable of…   815                  [OK]
......
[root@iZ1608aqb7ntn9Z ~]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
33847f680f63: Already exists 
dbb907d5159d: Pull complete 
8a268f30c42a: Pull complete 
b10cf527a02d: Pull complete 
c90b090c213b: Pull complete 
1f41b2f2bf94: Pull complete 
Digest: sha256:8f335768880da6baf72b70c701002b45f4932acae8d574dedfddaf967fc3ac90
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
[root@iZ1608aqb7ntn9Z ~]# docker run -d --name nginx -p 9000:80 nginx
e2f7da87581a49d74096814ea8a8ea4dcc739c398f78f9a187807f9e34e8133e

测试访问:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BYUc1sy3-1666578463217)(https://cdn.jsdelivr.net/gh/WEXIAWANG/PicGo_Store@main/img/20220411210604.png)]

10.2 Tomcat

[root@iZ1608aqb7ntn9Z ~]# docker search tomcat  # 查找
[root@iZ1608aqb7ntn9Z ~]# docker pull tomcat    # 下载
[root@iZ1608aqb7ntn9Z ~]# docker run -d --name tomcat -p 9000:8080 tomcat   # 启动
[root@iZ1608aqb7ntn9Z ~]# docker search tomcat
NAME                          DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
tomcat                        Apache Tomcat is an open source implementati…   3086      [OK]       
tomee                         Apache TomEE is an all-Apache Java EE certif…   91        [OK]    
[root@iZ1608aqb7ntn9Z ~]# docker pull tomcat
Using default tag: latest
latest: Pulling from library/tomcat
627b765e08d1: Pull complete 
c040670e5e55: Pull complete 
073a180f4992: Pull complete 
bf76209566d0: Pull complete 
f10db7ba7580: Pull complete 
5b2f970878fa: Pull complete 
ed434bfebf18: Pull complete 
f6c437110aa9: Pull complete 
a772951f83db: Pull complete 
752225c3768e: Pull complete 
Digest: sha256:6e40250d8fac4eca05c2067cb81f79427e4ddbaf4e78d5ecd21c35e8c5f2bfcf
Status: Downloaded newer image for tomcat:latest
docker.io/library/tomcat:latest
[root@iZ1608aqb7ntn9Z ~]# docker run -d --name tomcat -p 9000:8080 tomcat
f41a3e8b640da739d0b4b9dc161dc59ceb16d9ff899769834cdb4954a954374e

测试访问:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9EHmxcgQ-1666578463219)(https://cdn.jsdelivr.net/gh/WEXIAWANG/PicGo_Store@main/img/20220411210636.png)]

# 发现问题:1.linux命令少了,2.没有webapps,这是阿里云镜像的原因,默认是最小的镜像,所有不必要的都剔除掉,来保证最小可运行的环境!

10.3 ES

 # es 暴露的端口很多
 # es 十分耗内存
 # es 的数据一般需要放置到安全目录!挂载
 
 # 查看 docker stats 显示资源占用情况
 
 # 赶紧关闭es,增加内存限制,修改配置文件 -e 环境配置修改
    -e ES_JAVA_OPTS="-Xms128m -Xmx512m" elasticsearch:7.6.2

添加 -e ES_JAVA_OPTS="-Xms128m -Xmx512m‘ 配置ElasticSearch的虚拟机占用的内存大小。

docker stats 查看资源占用情况

$ docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms128m -Xmx512m" elasticsearch:7.6.2

[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker run -d --name elasticsearch01 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms128m -Xmx512m" elasticsearch:7.6.2
3b8cd4991814896c523ee67b84ce198e32bd82b1a62d512b198138a58ca946f1
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker ps
CONTAINER ID   IMAGE                 COMMAND                  CREATED          STATUS         PORTS                                            NAMES
3b8cd4991814   elasticsearch:7.6.2   "/usr/local/bin/dock…"   10 seconds ago   Up 6 seconds   0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp   elasticsearch01
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker stats

10.4 端口暴露的原理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h9JRaODx-1666578463221)(https://cdn.jsdelivr.net/gh/WEXIAWANG/PicGo_Store@main/img/20220411210706.png)]

Docker进阶篇

1 Docker镜像详解

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QKJN5I4a-1666578463222)(https://cdn.jsdelivr.net/gh/WEXIAWANG/PicGo_Store@main/img/20220411210740.png)]

1.1 UnionFS(联合文件系统)

  • 联合文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。联合文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
  • 特性:一次同时加载多个文件系统,但从外面看起来只能看到一个文件系统。联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。

1.2 镜像加载原理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P93chhxx-1666578463223)(https://cdn.jsdelivr.net/gh/WEXIAWANG/PicGo_Store@main/img/20220412091853.png)]

Docker的镜像实际由一层一层的文件系统组成:

  • bootfs(boot file system)主要包含bootloaderkernelbootloader主要是引导加载kernel,完成后整个内核就都在内存中了。此时内存的使用权已由bootfs转交给内核,系统卸载bootfs。可以被不同的Linux发行版公用。
  • rootfs(root file system),包含典型Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。rootfs就是各种不同操作系统发行版(Ubuntu,Centos等)。因为底层直接用Host的kernel,rootfs只包含最基本的命令,工具和程序就可以了。
  • 分层理解
    所有的Docker镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的容器层。容器在启动时会在镜像最外层上建立一层可读写的容器层(R/W),而镜像层是只读的(R/O)。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YsmwD2i4-1666578463225)(https://cdn.jsdelivr.net/gh/WEXIAWANG/PicGo_Store@main/img/20220411210844.png)]

1.3 提交容器打包成新镜像

docker commit -m "描述信息" -a "作者" 容器名 目标镜像名:[tag]  # 编辑容器后提交容器成为一个新镜像
示例:打包自己的tomcat镜像

# 启动一个默认的tomcat

# 发现这个默认的tomcat 是没有 webapps应用的,这是镜像的元婴,官方的镜像默认webapps下面是没有文件的

# 通过自己拷贝基本的文件,进行二次封装打包镜像
[root@iZ1608aqb7ntn9Z ~]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED        SIZE
tomcat                latest    46cfbf1293b1   13 days ago    668MB
.....
[root@iZ1608aqb7ntn9Z ~]# docker commit --help

Usage:  docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

Create a new image from a container's changes

Options:
  -a, --author string    Author (e.g., "John Hannibal Smith <hannibal@a-team.com>")
  -c, --change list      Apply Dockerfile instruction to the created image
  -m, --message string   Commit message
  -p, --pause            Pause container during commit (default true)
[root@iZ1608aqb7ntn9Z ~]# docker commit -m "Ymx tomcat" -a "ymx" 46cfbf1293b1 ymxtomcat:1.0
Error response from daemon: No such container: 46cfbf1293b1
[root@iZ1608aqb7ntn9Z ~]# docker commit -m "Ymx tomcat" -a "ymx" tomcat  ymxtomcat:1.0
sha256:ee3100b86b4939d52415da7a62c91d987d91be3ea4776f0ae3d2024b94fed6b4
[root@iZ1608aqb7ntn9Z ~]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED         SIZE
ymxtomcat             1.0       ee3100b86b49   5 seconds ago   668MB
tomcat                latest    46cfbf1293b1   13 days ago     668MB
......

2 容器数据卷

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nUyx2ePK-1666578463227)(https://cdn.jsdelivr.net/gh/WEXIAWANG/PicGo_Store@main/img/20220411210930.png)]

2.1 什么是容器数据卷?

为了实现数据持久化,使容器之间可以共享数据。可以将容器内的目录,挂载到宿主机上或其他容器内,实现同步和共享的操作。即使将容器删除,挂载到本地的数据卷也不会丢失。

2.2 使用容器数据卷

docker run -it -v 主机内目录:容器内目录 镜像名/id

将容器内目录挂载到主机内目录上,通过**docker inspect [容器名或ID]**命令查看该容器即可以看到挂载信息:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WcI9x0xE-1666578463234)(https://cdn.jsdelivr.net/gh/WEXIAWANG/PicGo_Store@main/img/20220411211004.png)]

# 挂载命令
[root@iZ1608aqb7ntn9Z 20210806]# docker run -it -v /opt/Docker/20210806/:/opt centos /bin/bash

# 进入到容器内部
[root@e749444d0ee1 /]# cd opt/
[root@e749444d0ee1 opt]# ls -l
total 0
-rw-r--r-- 1 root root 0 Aug  6 03:35 ymx

# 查看本机
[root@iZ1608aqb7ntn9Z ~]# cd /opt/Docker/20210806/
[root@iZ1608aqb7ntn9Z 20210806]# ll
总用量 0
-rw-r--r-- 1 root root 0 8月   6 11:35 ymx 

# docker inspect [容器名或ID] 查看挂载
[root@iZ1608aqb7ntn9Z 20210806]# docker inspect e749444d0ee1 
......
     "Mounts": [
            {
                "Type": "bind",
                "Source": "/opt/Docker/20210806",  # 对应主机的源目录
                "Destination": "/opt",    # 容器中的目录
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],
......

建立挂载关系后,只要使用命令在主机内新建一个文件

touch /home/mountdir/test.txt

就会在容器内的挂载目录下发现相同的文件(test.txt),从而实现了容器和主机的文件同步和共享:

在这里插入图片描述

实战:安装MySQL
[root@xxx home] # docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d 
// 可以多个映射
# 安装配置MySQL,需要配置密码,如果没有显示说明安装失败
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

# 启动成功之后,本地连接到服务器的3310和容器内的3306映射,成功连接


# 匿名挂载
docker run -d  -v 容器内目录  镜像名/id  # 匿名挂载   // 不指定主机名


# 具名挂载
docker run -d  -v 卷名:容器内目录  镜像名/id  # 具名挂载

# 指定路径挂载
docker run -d  -v /宿主机路径::容器内路径  镜像名/id  # 指定路径挂载

// 所有docker容器内的卷,在未指定主机内目录时,都在:**`/var/lib/docker/volumes/卷名/_data`** 下

2.3 匿名挂载

docker run -d  -v 容器内目录  镜像名/id  # 匿名挂载

匿名挂载后,使用docker volume ls命令查看所有挂载的卷:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vlNJMgiI-1666578463237)(https://cdn.jsdelivr.net/gh/WEXIAWANG/PicGo_Store@main/img/20220411211114.png)]

每一个VOLUME NAME对应一个挂载的卷,由于挂载时未指定主机目录,因此无法直接找到目录。

2.4 具名挂载

docker run -d  -v 卷名:容器内目录  镜像名/id  # 具名挂载

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dJtjjftP-1666578463239)(https://cdn.jsdelivr.net/gh/WEXIAWANG/PicGo_Store@main/img/20220411211137.png)]

可以发现挂载的卷:volume01,并通过docker volume inspect 卷名 命令找到主机内目录:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mSfHHLPG-1666578463241)(https://cdn.jsdelivr.net/gh/WEXIAWANG/PicGo_Store@main/img/20220411211149.png)]

所有docker容器内的卷,在未指定主机内目录时,都在:/var/lib/docker/volumes/卷名/_data 下,可通过具名挂载可以方便的找到卷,因此广泛使用这种方式进行挂载。

通过 -v 容器内路径,ro rw 改变读写权限

ro: readonly rw : readwrite

2.5 数据卷容器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GOyGYPOJ-1666578463245)(https://cdn.jsdelivr.net/gh/WEXIAWANG/PicGo_Store@main/img/20220411211204.png)]

docker run -it --name container02 --volumes from container01 镜像名/id  # 将两个容器进行挂载

--volumes from实现两个或多个容器之间实现数据共享,拷贝,一个容器的删除不会影响其他容器

3 DockerFile

Dockerfile是用来构建docker镜像的文件,一个命令参数脚本

3.1 构建步骤:

编写一个dockerfile文件,随后运行命令,可以生成镜像:

docker build -f 文件路径 -t 镜像名 .  # 文件名为Dockerfile时可省略且最后的.不要忽略
docker run     # 运行镜像
docker push    # 发布镜像 (DockerHub、阿里云镜像仓库)
[root@iZ1608aqb7ntn9Z 20210806]# vim Dockerfile 
# ----------写入内容-----------------
FROM centos      # 来自centos
CMD /bin/bash    # 进入到/bin/bash
CMD echo Hello Dockerfile   # 输出Hello Dockerfile
# ----------写入结束-----------------
[root@iZ1608aqb7ntn9Z 20210806]# docker build -f ./Dockerfile -t mydocker .
Sending build context to Docker daemon   2.56kB
Step 1/3 : FROM centos
 ---> 300e315adb2f
Step 2/3 : CMD /bin/bash
 ---> Running in 526f489adf0b
Removing intermediate container 526f489adf0b
 ---> 3c2af9c73098
Step 3/3 : CMD echo Hello Dockerfile
 ---> Running in 023af54a93e2
Removing intermediate container 023af54a93e2
 ---> 7753b44c9137
Successfully built 7753b44c9137
Successfully tagged mydocker:latest
[root@iZ1608aqb7ntn9Z 20210806]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED          SIZE
mydocker              latest    7753b44c9137   6 seconds ago    209MB
......
[root@iZ1608aqb7ntn9Z 20210806]# docker run -it mydocker
Hello Dockerfile

3.2 DockerFile命令

命令(大写字母)效果
FROM基础镜像:Centos/Ubuntu
MAINTAINER镜像作者+邮箱
RUN镜像构建的时候需要运行的命令
ADD为镜像添加内容(压缩包)
WORKDIR镜像工作目录(进入容器时的目录)
VOLUME设置卷,挂载的目录
EXPOSE暴露端口配置,指定对外端口
CMD/ENTRYPOINT指定这个容器启动时要运行的命令(CMD替代先前命令只有最后一个CMD会生效,ENTRYPOINT在先前命令后追加)
COPY类似于ADD,将文件拷贝到镜像中
ENV构建时设置环境变量
ONBUILD当构建一个被继承 DockerFile 这个时候就会运行 ONBUILD的指令

3.3 构建过程

  • 每个保留关键字(指令)都必须是大写字母
  • 从上到下顺序执行
  • “#” 表示注释
  • 每一个指令都会创建提交一个新的镜像层并提交
# 利用 docker history 可以查看镜像的生成过程
 docker history [OPTIONS] IMAGE

3.4 构建实例(jdk+tomcat)

[root@iZ1608aqb7ntn9Z 20210806]# vim DockerFile2
# -----------写入文件--------------

FROM centos
  
COPY ymx /opt/Docker/20210806/ymx

ADD jdk8.tar.gz /usr/local       # 将 jdk8.tar.gz 添加到 /usr/local 目录
ADD tomcat.tar.gz /usr/local      # 将 tomcat.tar.gz 添加到 /usr/local 目录

RUN yum -y install vim

ENV MYPATH /usr/local    // 进入容器切换到local目录
WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk1.8.0_141
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH $PATH:$JAVA_HOME/bin

EXPOSE 8080

# -----------写入文件完成--------------
[root@iZ1608aqb7ntn9Z 20210806]# ls
Dockerfile  DockerFile2  ymx
[root@iZ1608aqb7ntn9Z 20210806]# cp /tmp/jdk8.tar.gz jdk8.tar.gz
[root@iZ1608aqb7ntn9Z 20210806]# cp /tmp/tomcat.tar.gz tomcat.tar.gz
[root@iZ1608aqb7ntn9Z 20210806]# ls
Dockerfile  DockerFile2  jdk8.tar.gz  tomcat.tar.gz  ymx
[root@iZ1608aqb7ntn9Z 20210806]# docker build -f ./DockerFile2 -t mytomcat9 . 
Sending build context to Docker daemon    197MB
Step 1/11 : FROM centos
......
Successfully built 86a9a8dd939a
Successfully tagged mytomcat9:latest
[root@iZ1608aqb7ntn9Z 20210806]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED             SIZE
mytomcat9             latest    86a9a8dd939a   26 seconds ago      667MB
......
[root@iZ1608aqb7ntn9Z 20210806]# docker run -it mytomcat9 /bin/bash
[root@ed5fd71834e2 local]# ls
apache-tomcat-9.0.44  bin  etc  games  include  jdk1.8.0_141  lib  lib64  libexec  sbin  share  src
[root@ed5fd71834e2 local]# java -version
java version "1.8.0_141"
Java(TM) SE Runtime Environment (build 1.8.0_141-b15)
Java HotSpot(TM) 64-Bit Server VM (build 25.141-b15, mixed mode)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hbEQ9Nsy-1666578463247)(https://cdn.jsdelivr.net/gh/WEXIAWANG/PicGo_Store@main/img/20220411211707.png)]

3.5 发布自己的镜像至Docker Hub及阿里云容器

login-----> push

 docker login [OPTIONS] [SERVER]

Options

Name, shorthandDefaultDescription
--password , -pPassword
--password-stdinTake the password from stdin
--username , -uUsername
docker push [OPTIONS] NAME[:TAG]

Options

Name, shorthandDefaultDescription
--all-tags , -aPush all tagged images in the repository
--disable-content-trusttrueSkip image signing
--quiet , -qSuppress verbose output

阿里云部署

登录阿里云 ---- > 找到容器镜像服务 ----> 创建命名空间 -------> 创建容器镜像 -------> 浏览阿里云

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lNlxGjWB-1666578463251)(https://cdn.jsdelivr.net/gh/WEXIAWANG/PicGo_Store@main/img/20220412153724.png)]

4 Docker网络(容器互连)

4.1 理解Docker

通过命令**ip addr查看本地ip地址**,我们发现除了本机回环地址和阿里云的内网地址外,还多了一个网卡:Docker0,这是Docker服务启动后自动生成的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NzZOfLVW-1666578463263)(https://cdn.jsdelivr.net/gh/WEXIAWANG/PicGo_Store@main/img/20220411211751.png)]

而如果进入一个正在后台运行的tomcat容器,同样使用ip addr命令,发现容器得到了一个新的网络:12: eth@if13,ip地址:172.17.0.2。这是Docker在容器启动时为其分配的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CACObr3r-1666578463264)(https://cdn.jsdelivr.net/gh/WEXIAWANG/PicGo_Store@main/img/20220411211800.png)]

思考一个问题:此时我们的linux主机可以ping通容器内部(172.17.0.2)吗?(注意与容器暴露端口相区分

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kcGiSSO5-1666578463267)(https://cdn.jsdelivr.net/gh/WEXIAWANG/PicGo_Store@main/img/20220411211814.png)]

  • linux可以ping通docker容器内部,因为docker0的ip地址为172.17.0.1,容器为172.17.0.2。

  • 原理:我们每启动一个docker容器,docker就会给容器分配一个默认的可用ip,我们只要安装了docker,就会有一个网卡docker0(bridge)。网卡采用桥接模式,并使用veth-pair技术(veth-pair就是一堆虚拟设备接口,成对出现,一段连着协议,一段彼此相连,充当一个桥梁。)。

  • 这时我们退出容器,回到主机再次观察主机的ip地址:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ofRJYC26-1666578463268)(https://cdn.jsdelivr.net/gh/WEXIAWANG/PicGo_Store@main/img/20220411211837.png)]

  • 我们惊奇地发现了一个新网络13: vethda1df4b@if12,对应容器内网络地址的12: eth@if13

  • 容器和容器之间是可以互相ping通的:容器1→Docker0→容器2

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t7IwNtZ3-1666578463269)(https://cdn.jsdelivr.net/gh/WEXIAWANG/PicGo_Store@main/img/20220411211854.png)]

  • docker中的所有网络接口都是虚拟的 ,转发效率高。删除容器后,对应的网桥也随之删除。

4.2 --link

若编写一个微服务并连接数据库,如果数据库ip改变,如何根据容器名而不是ip访问容器?显然,直接使用容器名是无法ping通容器内部的:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wwjiALJ1-1666578463270)(https://cdn.jsdelivr.net/gh/WEXIAWANG/PicGo_Store@main/img/20220411211913.png)]

这时我们可以在容器启动命令中加入一个选项:–link,使得我们可以根据容器名来访问容器:

docker run -d -P --link 容器名/id 镜像名/id

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UlS65sUd-1666578463271)(https://cdn.jsdelivr.net/gh/WEXIAWANG/PicGo_Store@main/img/20220411211930.png)]

然而反向就不可以ping通,这是因为–link的本质是把需要连接的容器名/id写入启动容器的hosts配置文件中,即增加了一个ip和容器名/id的映射:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-84zEblJ8-1666578463273)(https://cdn.jsdelivr.net/gh/WEXIAWANG/PicGo_Store@main/img/20220411211940.png)]

目前已经不建议使用这种方式

4.3 自定义网络

我们使用命令:

docker network ls    # 查看所有的docker网络

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kanGY71S-1666578463274)(https://cdn.jsdelivr.net/gh/WEXIAWANG/PicGo_Store@main/img/20220411212001.png)]

docker中的网络模式有:

  • bridge:桥接(docker默认)/
  • none:不配置网络 /
  • host:和宿主机共享网络

docker run 命令默认带有一个参数–net bridge,此处的bridge指的就是docker0。如果我们不想使用docker0,那如何创建一个新的网络呢?

docker  network create --driver 网络模式 --subnet 子网ip --gateway 网关 网络名     

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hgfCVIHc-1666578463275)(https://cdn.jsdelivr.net/gh/WEXIAWANG/PicGo_Store@main/img/20220411212029.png)]

我们不仅在docker network ls命令下发现了这个新创建的网络newnet,还可以使用docker network inspect命令查看其详细信息,包括了我们创建时定义的子网ip和网关:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C6k56ugB-1666578463277)(https://cdn.jsdelivr.net/gh/WEXIAWANG/PicGo_Store@main/img/20220411212045.png)]

只要两个容器启动时都通过 –net,选用了同一个已创建的网络,不同容器间即可通过ip地址或容器名/id连通:

image-20220411212058378

 docker network create [OPTIONS] NETWORK

Options

Name, shorthandDefaultDescription
--attachableAPI 1.25+ Enable manual container attachment
--aux-addressAuxiliary IPv4 or IPv6 addresses used by Network driver
--config-fromAPI 1.30+ The network from which to copy the configuration
--config-onlyAPI 1.30+ Create a configuration only network
--driver , -dbridgeDriver to manage the Network
--gatewayIPv4 or IPv6 Gateway for the master subnet
--ingressAPI 1.29+ Create swarm routing-mesh network
--internalRestrict external access to the network
--ip-rangeAllocate container ip from a sub-range
--ipam-driverIP Address Management Driver
--ipam-optSet IPAM driver specific options
--ipv6Enable IPv6 networking
--labelSet metadata on a network
--opt , -oSet driver specific options
--scopeAPI 1.30+ Control the network’s scope
--subnetSubnet in CIDR format that represents a network segment

4.4 网络连通

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pX6yR8w3-1666578463279)(https://cdn.jsdelivr.net/gh/WEXIAWANG/PicGo_Store@main/img/20220411212111.png)]

对于建立在不同网络下(docker0, newnet)的两个容器tomcat01和tomcat02,他们的网段不同,因此是无法彼此ping通容器内部的:

这时我们需要通过**docker network connect**命令打通容器与网络之间的连接:

docker network connect 网络名 容器名/id

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SLYDJvKY-1666578463281)(https://cdn.jsdelivr.net/gh/WEXIAWANG/PicGo_Store@main/img/20220411212129.png)]

连通之后,将 tomcat-01 放到了 newnet 网络下,一个容器,两个ip

 docker network connect [OPTIONS] NETWORK CONTAINER

Options

Name, shorthandDefaultDescription
--aliasAdd network-scoped alias for the container
--driver-optdriver options for the network
--ipIPv4 address (e.g., 172.30.100.104)
--ip6IPv6 address (e.g., 2001:db8::33)
--linkAdd link to another container
--link-local-ipAdd a link-local address for the container

5 部署Redis集群

# 创建网卡

docker network create redis --submit 172.38.0.0/16

# 通过 脚本 创建六个redis配置
for port in $(seq 1 6);\
do \
mkdir -p /mydata/redis/node-${port}/conf
touch /mydata/redis/node-${port}/conf/redis.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

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; \

docker run -p 6371${port}:6379 -p 16371${port}:16379 -name redis-1 \
-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.11 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf; \

docker run -p 6373${port}:6379 -p 16373${port}:16379 -name redis-3 \
-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.13 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf; \


# 创建集群
redis-cli --cluster create 172.38.0.11:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 
172.38.0.16:6379 --cluster-replicas l

6 SpringBoot微服务打包Docker镜像

1、构建SpringBoot项目

2、打包运行

mvn package

3、编写Dockerfile

FROM java:8
COPY *.jar /app.jar
CMD ["--server.port=8080"]
EXPOSE 8080
ENTRYPOINT ["java","-jar","app.jar"]

4、构建镜像

# 1.复制jar和DockerFIle到服务器
# 2.构建镜像
$ docker build -t xxxxx:xx  .
123

5、发布运行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值