Docker安装文档

目录

1.什么是Docker?

2.Docker是干嘛的?

3.Docker基本组成

3.1.docker流程 

4.Docker安装

4.1.环境准备

4.2.卸载Docker

4.3.需要的安装包

4.4.设置镜像仓库

4.5.更新yum索引

4.6.安装docker (docker-ce 社区版免费  docker-ee 企业版)

4.7.启动docker

4.8.验证docker是否启动成功

4.9.测试

4.10.查看下载的hello-world镜像

4.11.卸载docker

4.11.1.卸载 Docker 引擎、CLI 和容器包

4.11.2.主机上的映像、容器、卷或自定义配置文件不会自动删除。删除所有映像、容器和卷

5.Docker底层原理

6.Docker常用命令

6.1.镜像命令

6.2.容器命令

6.2.1.*有了镜像才能创建容器

6.2.2.新建容器并启动

6.2.3.启动并进入容器

 6.2.4.退出容器

6.2.5.列出所有的运行的容器

6.2.6.删除

6.2.7.启动和停止容器的操作

6.2.8.查看网络

6.3.常用其他命令

6.3.1.后台启动镜像

6.3.2.查看日志

6.3.3.查看容器中的进程信息

6.3.4.查看镜像元数据

6.3.5.**进入当前正在进行的容器

6.3.6.拷贝

7.安装实例

7.1.安装nginx

7.1.1.搜索镜像

7.1.2.下载镜像

7.1.3.查看镜像

7.1.4.运行测试

 8.可视化管理

8.1.potainer(先用这个);提供图形管理工具

8.2.Rancher(CI/CD在用)

9.提交自己的镜像commit

10.容器数据卷

10.1.什么是容器数据卷

10.2.使用卷

10.2.1.直接挂载

10.2.2.命令

11.Dockerfile

 11.1.基础知识

11.2.DockerFile指令

 11.3.测试

11.4.发布自己的镜像

12.Docker网络

12.1.理解docker0

12.2.测试

12.3.原理

12.4.容器互联(--link)(不建议使用)

12.5.自定义网络

12.5.1.网络模式

12.5.2.测试

12.6.网络连通

问题反馈

问题一:是否可以给运行过的容器挂载目录?

问题二:systemctl stop docker 停止docker服务时报错,这是由于docker有调用启动服务模式,导致你停止docker服务之后,自动重启了

问题三:docker是否可以装一个环境,并在这个环境中安装其他软件?


1.什么是Docker?

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 LinuxWindows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

2.Docker是干嘛的?

解决运行环境不一致所导致的问题。这样就不会产生“本地运行没问题,可一到服务器上就不行了”的情况。
限定最大的cpu使用内存硬盘,这样就起到了隔离的作用,避免产生“一块代码产生死循环,把磁盘占满了,其它程序也挂了”的情况。
总结成一句话:docker的标准化让快速扩展,弹性伸缩变得简单。

3.Docker基本组成

镜像(image):

docker的镜像实际上是由一层一层的文件系统组成的,这种层级的文件系统叫做UnionFS 联合文件系统

1.bootfs(boot file system)主要包括bootloader和kernel, bootloader主要是引导加载kernel,linux刚启动时候会加载bootfs文件系统,在docker镜像的最底层是bootfs。 这一层与我们典型的Linux/Unix系统是一样的,包括boot加载器和内核。当boot加载完之后,整个内核就在内存中了,此时内存的使用权已经有bootfs 交由内核,此时系统也会卸载bootfs;

2.rootfs(root file system), 在bootsfs之上,包含的就是典型的Linux系统中的/dev/,proc,/bin, /etc等标准目录文件,rootfs就是各种不同的操作系统发行版,比如Ubuntu, Centos等,对于一个精简的OS, rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层用Host的Kernel,自己只需要提供rootfs就行。由此可见,对于不同的linux发行版,bootds基本是一致的,rootfs会有差别,因此不同的发行版可以共用bootfs;

bootfs bootloader 引导加载

容器(container):

容器是镜像的运行时实例。正如从虚拟机模板上启动 VM 一样,用户也同样可以从单个镜像上启动一个或多个容器。

虚拟机和容器最大的区别是容器更快并且更轻量级——与虚拟机运行在完整的操作系统之上相比,容器会共享其所在主机的操作系统/内核。

下图为使用单个 Docker 镜像启动多个容器的示意图。
 

使用单个Docker镜像启动多个容器

仓库(registry):

Docker 仓库是用来包含镜像的位置,Docker提供一个注册服务器(Register)来保存多个仓库,每个仓库又可以包含多个具备不同tag的镜像。Docker运行中使用的默认仓库是 Docker Hub 公共仓库。docker hub是docker公司维护的公共仓库,用户可以免费使用,也可以购买私有仓库。

3.1.docker流程 

4.Docker安装

4.1.环境准备

服务器、CentOS7(系统内核在3.0以上)

官方文档:在 CentOS | 上安装 Docker 引擎Docker 文档

docker库Docker Hub Container Image Library | App Containerization

4.2.卸载Docker

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

4.3.需要的安装包

yum install -y yum-utils

4.4.设置镜像仓库

yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo   #(默认国外的、建议不用)

yum-config-manager \
    --add-repo \
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo  #建议使用

4.5.更新yum索引

yum makecache fast

4.6.安装docker (docker-ce 社区版免费  docker-ee 企业版)

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

4.7.启动docker

systemctl start docker

4.8.验证docker是否启动成功

docker version


#结果如下

Client: Docker Engine - Community
 Version:           20.10.11
 API version:       1.41
 Go version:        go1.16.9
 Git commit:        dea9396
 Built:             Thu Nov 18 00:38:53 2021
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.11
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.16.9
  Git commit:       847da18
  Built:            Thu Nov 18 00:37:17 2021
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.4.12
  GitCommit:        7b11cfaabd73bb80907dd23182b9347b4245eb5d
 runc:
  Version:          1.0.2
  GitCommit:        v1.0.2-0-g52b36a2
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

4.9.测试

docker run hello-world

#结果如下

Unable to find image 'hello-world:latest' locally      #-----------本地没有镜像
latest: Pulling from library/hello-world
2db29710123e: Pull complete                            #------------拉取镜像  
Digest: sha256:cc15c5b292d8525effc0f89cb299f1804f3a725c8d05e158653a563f15e4f685
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/

4.10.查看下载的hello-world镜像

docker images

4.11.卸载docker

4.11.1.卸载 Docker 引擎、CLI 和容器包

yum remove docker-ce docker-ce-cli containerd.io

4.11.2.主机上的映像、容器、卷或自定义配置文件不会自动删除。删除所有映像、容器和卷

/var/lib/docker为默认工作路径

 sudo rm -rf /var/lib/docker

 sudo rm -rf /var/lib/containerd

5.Docker底层原理

5.1.docker是如何工作的?

5.2.docker为什么比VM轻?

6.Docker常用命令

docker  version  #显示docker版本信息

docker info         #显示docker的系统信息,包括镜像和容器数量

docker hlep        #docker帮忙

官网API地址:docker save | Docker Documentation

6.1.镜像命令

docker images #查看所有本地的主机上的镜像

docker search [name] #搜索

docker pull [name][:tag] #下载镜像 name:镜像名  tag:版本    ** 核心:联合文件系统

docker rm -f [容器id]   #删除镜像

docker stats [容器id]        #查看容器内存使用效率

6.2.容器命令

6.2.1.*有了镜像才能创建容器

docker pull centos

6.2.2.新建容器并启动

docker run [可选参数] image

#参数说明 

--name="Name"          容器名字 tomcat01,tomcat02 用来区分容器

-d                                后台方式运行

-it                                使用交互方式运行,进入容器查看内容

-p                                指定容器的端口 -p 8080:8080  

        |         -p  ip:主机端口:容器端口

        |        -p 主机端口:容器端口

        |        -p 容器端口

        |        容器端口

-P                                随机指定端口

-v                                挂载卷

        |        容器内路径        #匿名挂载

        |        卷名:容器内路径        #具名挂载

        |        /宿主机路径:容器内路径        #指定路径挂载

-e                                配置环境

--privileged=true                 使container内的root拥有真正的root权限,不进行降权处理。否则,容器内的用户只是外部的一个普通用户

--storage-opt size=30G    配置容器大小

6.2.3.启动并进入容器

docker run -it centos /bin/bash

 6.2.4.退出容器

exit  #容器停止并退出

#使用快捷键:Ctrl+P+Q   #容器不停止并退出

6.2.5.列出所有的运行的容器

docker ps 命令

        -a         #所有运行、运行过的容器

        -n=?        #显示最近创建容器

        -q        #只显示容器的编号

6.2.6.删除

docker rm [容器id]         #删除指定容器,不能删除运行中容器;强制删除  docker rm -f  [容器id]

docker rm -f ${docker ps -aq}        #删除所有的容器

6.2.7.启动和停止容器的操作

docker start [容器id]        #启动容器

docker restart [容器id]        #重启容器

docker stop [容器id]        #停止单签正在运行的容器

docker kill [容器id]        #强制停止容器

6.2.8.查看网络

docker network ls

6.3.常用其他命令

6.3.1.后台启动镜像

docker run -d [镜像名]

#问题docker ps 发现centos停止了

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

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

6.3.2.查看日志

docker logs [容器id]         #显示日志

        -tf        #显示所有日志

        --tail [数量]        #要显示的条数

docker history [容器id]                #查看容器操作日志

6.3.3.查看容器中的进程信息

docker top [容器id]

6.3.4.查看镜像元数据

docker inspect [容器id] 

6.3.5.**进入当前正在进行的容器

方式一:docker exec -it [容器id] [bashShell]        #进入容器开启新的终端

方式二:docker attach -it [容器id] [bashShell]        #进入容器正在运行的终端

6.3.6.拷贝

docker cp [容器id]:[容器内路径] [主机路径]         #将容器中的文件拷贝到主机上

6.3.7.重命名

docker tag [镜像名]:[版本]  [新的镜像名]:[版本]                #镜像重命名

docker rename [容器名] [新的容器名]                #容器名重命名

7.安装实例

7.1.安装nginx

7.1.1.搜索镜像

docker search nginx  #可以去官网上查询https://registry.hub.docker.com/

7.1.2.下载镜像

docker pull nginx

7.1.3.查看镜像

docker images

7.1.4.运行测试

docker run -d --name nginx01 -p 3344:80 nginx   #启动docker中的nginx,改名为nginx01,端口映射为容器内部80映射为外部3344

docker ps    #查询docker运行状态

 端口暴露概念图:

curl localhost:3344        #访问容器中的nginx项目

 8.可视化管理

8.1.potainer(先用这个);提供图形管理工具

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

访问地址http://ip:8088

进入设置密码界面=》选择本地lcal=》进入首页

8.2.Rancher(CI/CD在用)

9.提交自己的镜像commit

下载一个默认镜像,之后对其进行操作,保存提交为一个新镜像。

docker mimmit -m="提交的描述信息" -a="作者" [容器id] 目标镜像名:[tag]

docker commit -m="第一次提交" -a="selectDele" db9a4f1a773e newnginx01:1.0

10.容器数据卷

10.1.什么是容器数据卷

Docker容器中产生的数据,同步到本地!目录的挂载,将我们容器的目录,挂载到linux上面!

当我们在使用docker容器的时候,会产生一系列的数据文件,这些数据文件在我们关闭docker容器时是会消失的,但是其中产生的部分内容我们是希望能够把它给保存起来另作用途的,Docker将应用与运行环境打包成容器发布,我们希望在运行过程钟产生的部分数据是可以持久化的的,而且容器之间我们希望能够实现数据共享。

通俗地来说,docker容器数据卷可以看成使我们生活中常用的u盘,它存在于一个或多个的容器中,由docker挂载到容器,但不属于联合文件系统,Docker不会在容器删除时删除其挂载的数据卷。

特点:

1:数据卷可以在容器之间共享或重用数据

2:数据卷中的更改可以直接生效

3:数据卷中的更改不会包含在镜像的更新中

4:数据卷的生命周期一直持续到没有容器使用它为止

添加数据卷的方式有两种,第一种是直接通过命令行挂载,第二种是通过dockerFile添加

总结:容器的持久化和同步操作!容器间也可以数据共享!

10.2.使用卷

10.2.1.直接挂载

docker run -it -v  /宿主机绝对路径目录:  /容器内目录  镜像名

docker run -ite -v /root/home/test:/home  centos /bin/bash

具名挂载,卷有名字的挂载,方便查找,路径为/var/lib/dokcer/volume

docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx

匿名挂载,卷没有名字的挂载

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

拓展:

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

ro        readonly        #只读        容器内部无法操作文件,只能外部操作

rw        readwrite        #可读可写

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

docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx

10.2.2.命令

docker volume ls 查看卷

11.Dockerfile

Dockerfile 就是构建docker镜像的构建文件!命令脚本!

创建一个文件dockerfile1

FROM centos    #来自centos镜像

VOLUME ["volume01","volume02"]    #创建卷01,02

CMD echo "----end-----"    #打印end

CMD /bin/bash    #执行命令

build        #构建文件dockerfile1

-f        #文件地址

-f        #生成centos1.0

.        #当前目录下

docker build -f /home/dockerfile1 -t /test/centos:1.0 .

 11.1.基础知识

  • 每个保留关键字(指令)都必须是大写字母
  • 执行从上到下顺序执行
  • #代表注释
  • 每个指令都会创建一个新镜像层,并提交!

11.2.DockerFile指令

FROM                #基础镜像,一切的起源

MAINTAINER        #镜像的作者,姓名+邮箱

RUN                #镜像构建的时候需要运行命令

ADD                #添加镜像内容,自动解压

WORKDIR                #镜像的工作目录

VOLUME                #挂载的目录

EXPOSE                #指定暴露端口

CMD                #指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代

ENTRYPOINT                #指定这个容器启动的时候要运行的命令,可以追加命令

ONBUILD                #当构建一个被继承DockerFile这个时候就会运行 ONBUILD的指令,触发指令。

COPY                #类似ADD,将我们文件拷贝到镜像

ENV                #构建的是时候设置环境变量

 11.3.测试

基本语法

 创建一个自己的centos:

创建文件  mydockerfile,官方文件命名:DockerFile

[root@VM-16-7-centos myDockerFile]# cat mydockerfile 
FROM centos
MAINTAINER selectDele<838830372@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构建命令

docker build -f mydockerfile -t mycentos:0.1 .

 最终结果:

Successfully built 916c351ccbff
Successfully tagged mycentos:0.1

11.4.发布自己的镜像

11.4.1.注册

地址:Docker Hubhttps://hub.docker.com/settings/general

 11.4.2.登录

11.4.3.在服务器上提交自己的镜像

[root@VM-16-7-centos ~]# docker login --help

Usage:  docker login [OPTIONS] [SERVER]

Log in to a Docker registry.
If no server is specified, the default is defined by the daemon.

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

结果: 

 

 提交镜像

docker push [镜像名]:[tag]

12.Docker网络

12.1.理解docker0

12.2.测试

12.3.原理

每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要安装了docker,就会有一个网卡docker0桥接模式,使用了evth-pair技术!

docker容器带来的网卡都是一对一对的,evth-pair 就是一对的虚拟设备接口,都是成对出现的,一段连着协议,一段彼此连接,evth-pair 就像一个桥梁,连接各种虚拟网络设备。

只要容器删除相对应的一对网卡将会被删除。 

12.4.容器互联(--link)(不建议使用)

容器和容器之间的相互ping:
这里我们启动两个tomcat容器 (tomcat01、tomcat02),通过容器名ping:


我们发现时ping不通的,docker提供了 --link命令

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

这时我们再通过容器名去ping:


发现可以ping通了!反向ping可以通吗? 

不能反向ping!因为我们是用 tomcat02 --link tomcat01。

--link本质
我们查看tomcat02的网络配置文件,可以发现它与tomcat01的关联:

所以docker 的–link命令,其实就是在hosts文件中增加了一个映射!

12.5.自定义网络

查看docker network ls

12.5.1.网络模式

bridge:桥接docker(默认,自己创建也使用bridge模式)

none:不配置网络

host:和宿主主机共享网络

container:容器网络连通(用得少,局限大)

12.5.2.测试

默认启动

docker run -d -P --name nginx01 nginx

#我们直接启动的命令 --netbridge,那这个就是我们的docker0
docker run -d -P --name nginx01 -net bridge nginx

自定义网络:

 创建一个自己的网路 mynet

--driver                #网关模式 bridge

--subnet                #配置的子网掩码 192.168.0.0/16

--gateway                #配置网关  192.168.0.1        “mynet“为网关名称

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

 

 

将容器放到自己的网络中

docker run -d -P --name nginx-net-01 --net mynet nginx

docker run -d -P --name nginx-net-02 --net mynet nginx

以上内容可以得出,mynet网关中出现了两个容器 

 如果出现一下问题

请使用从宿主进入容器,执行以下命令

apt-get update



apt-get install iputils-ping

12.6.网络连通

我们假象在不同网卡上的容器间能否直连?


显然这样是不可能的!

我们可以使用docker network connect连接,连接一个容器到一个网络,从而实现!


测试:

# 将docker0下的nginx-01连接到mynet网卡上
docker network connect mynet nginx-01


问题反馈

问题一:是否可以给运行过的容器挂载目录?

解决方案:

关闭docker服务systemctl stop docker;

准备挂载目录:

# 创建挂载目录,自定义
mkdir /usr/local/mysql_config

# 创建MySQL的配置文件,这里也可以直接挂载目录,看自己需求
touch /usr/local/mysql_config/my.cnf

进入宿主机目录:

# 宿主机的容器路径
cd /var/lib/docker/containers/

# 查看当前容器目录
ls
## 我这里有五个容器
[root@localhost containers]# ls
121f35fb4abf7a424cb2413af9dd43698c9cef475ef873586121296b7409270d  2031dad679823430394425a53946cc6809b021f2f0854b512490d469faac1028  a077ae243bfac33f62bc5135e414121510b4f0860c00c64d22afdb83051e3d60
199491b3be9a0d3ca31ed88f403cda6d8d345ab8a056b618ad850729cff2e216  97cc3f4e08fd0e74662cf24f3117465111310a5f2efb7c1e0e97ee9c2a8d5845

# 查看Docker启动的容器
docker images
## 可以看到五个容器,注意CONTAINER ID,对比上面的容器目录,可以看到CONTAINER ID跟上面目录的前一段是相同的,所以相同的一段就是改容器的目录
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS                                                                                              NAMES
121f35fb4abf        5c62e459e087        "docker-entrypoint..."   58 minutes ago      Exited (0) 5 minutes ago                                                                                                      mysql_1
97cc3f4e08fd        5c62e459e087        "docker-entrypoint..."   About an hour ago   Up 10 seconds              33060/tcp, 0.0.0.0:3307->3306/tcp                                                                  mysql_test
199491b3be9a        4fc5fe6c8c09        "docker-entrypoint..."   5 weeks ago         Exited (255) 4 weeks ago   4369/tcp, 0.0.0.0:5672->5672/tcp, 5671/tcp, 15691-15692/tcp, 25672/tcp, 0.0.0.0:15672->15672/tcp   rabbit
2031dad67982        49c664c4f907        "/sbin/tini -- /us..."   2 months ago        Exited (255) 5 weeks ago   50000/tcp, 0.0.0.0:10240->8080/tcp                                                                 jenkins
a077ae243bfa        5c62e459e087        "docker-entrypoint..."   2 months ago        Exited (255) 9 days ago    0.0.0.0:3306->3306/tcp, 33060/tcp                                                                  mysql
                                                               mysql
# 这里我是mysql_test容器,所以进入的是CONTAINER ID=97cc3f4e08fd的容器目录
cd 97cc3f4e08fd0e74662cf24f3117465111310a5f2efb7c1e0e97ee9c2a8d5845

修改容器目录下的配置文件 :

# 查看容器目录下的文件 ls,主要修改的是hostconfig.json、config.v2.json文件
checkpoints  config.v2.json  hostconfig.json  hostname  hosts  resolv.conf  resolv.conf.hash  secrets  shm

(1).编辑 vi hostconfig.json 

{"Binds":["/usr/local/mysql_config/my.cnf:/etc/mysql/conf.d/mysql.cnf"],"ContainerIDFile":"","LogConfig":{"Type":"journald","Config":{}},"NetworkMode":"default","PortBindings":{"3306/tcp":[{"HostIp":"","HostPort":"3307"}]},"RestartPolicy":{"Name":"no","MaximumRetryCount":0},"AutoRemove":false,"VolumeDriver":"","VolumesFrom":null,"CapAdd":null,"CapDrop":null,"Dns":[],"DnsOptions":[],"DnsSearch":[],"ExtraHosts":null,"GroupAdd":null,"IpcMode":"","Cgroup":"","Links":null,"OomScoreAdj":0,"PidMode":"","Privileged":false,"PublishAllPorts":false,"ReadonlyRootfs":false,"SecurityOpt":null,"UTSMode":"","UsernsMode":"","ShmSize":67108864,"Runtime":"docker-runc","ConsoleSize":[0,0],"Isolation":"","CpuShares":0,"Memory":0,"NanoCpus":0,"CgroupParent":"","BlkioWeight":0,"BlkioWeightDevice":null,"BlkioDeviceReadBps":null,"BlkioDeviceWriteBps":null,"BlkioDeviceReadIOps":null,"BlkioDeviceWriteIOps":null,"CpuPeriod":0,"CpuQuota":0,"CpuRealtimePeriod":0,"CpuRealtimeRuntime":0,"CpusetCpus":"","CpusetMems":"","Devices":[],"DiskQuota":0,"KernelMemory":0,"MemoryReservation":0,"MemorySwap":0,"MemorySwappiness":-1,"OomKillDisable":false,"PidsLimit":0,"Ulimits":null,"CpuCount":0,"CpuPercent":0,"IOMaximumIOps":0,"IOMaximumBandwidth":0}


# 注意:主要修改Binds,这里我已经添加了宿主机/usr/local/mysql_config/my.cnf,挂载到容器里的/etc/mysql/conf.d/mysql.cnf

 (2).编辑vi config.v2.json

{"StreamConfig":{},"State":{"Running":true,"Paused":false,"Restarting":false,"OOMKilled":false,"RemovalInProgress":false,"Dead":false,"Pid":8371,"ExitCode":0,"Error":"","StartedAt":"2021-12-06T02:32:25.933774901Z","FinishedAt":"2021-12-06T02:31:52.626517025Z","Health":null},"ID":"97cc3f4e08fd0e74662cf24f3117465111310a5f2efb7c1e0e97ee9c2a8d5845","Created":"2021-12-06T01:10:21.46030513Z","Managed":false,"Path":"docker-entrypoint.sh","Args":["mysqld"],"Config":{"Hostname":"97cc3f4e08fd","Domainname":"","User":"","AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"ExposedPorts":{"3306/tcp":{},"33060/tcp":{}},"Tty":true,"OpenStdin":true,"StdinOnce":false,"Env":["MYSQL_ROOT_PASSWORD=123456","PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin","GOSU_VERSION=1.12","MYSQL_MAJOR=8.0","MYSQL_VERSION=8.0.25-1debian10"],"Cmd":["mysqld"],"Image":"5c62e459e087","Volumes":{"/var/lib/mysql":{}},"WorkingDir":"","Entrypoint":["docker-entrypoint.sh"],"OnBuild":null,"Labels":{}},"Image":"sha256:5c62e459e087e3bd3d963092b58e50ae2af881076b43c29e38e2b5db253e0287","NetworkSettings":{"Bridge":"","SandboxID":"c62ac687dd649755ce204943b5fd36a41f9a50a9341468964c3b441a8decb34a","HairpinMode":false,"LinkLocalIPv6Address":"","LinkLocalIPv6PrefixLen":0,"Networks":{"bridge":{"IPAMConfig":null,"Links":null,"Aliases":null,"NetworkID":"c630c2e2f21205d13e4a919634f714ed09ac57764e3b8cc4fbead8711cfd66a3","EndpointID":"db6e5134f3f4449e3683a1d5b39ba3fd5a7e1c8679984a98f112781afbe309aa","Gateway":"172.17.0.1","IPAddress":"172.17.0.2","IPPrefixLen":16,"IPv6Gateway":"","GlobalIPv6Address":"","GlobalIPv6PrefixLen":0,"MacAddress":"02:42:ac:11:00:02","IPAMOperational":false}},"Service":null,"Ports":{"3306/tcp":[{"HostIp":"0.0.0.0","HostPort":"3307"}],"33060/tcp":null},"SandboxKey":"/var/run/docker/netns/c62ac687dd64","SecondaryIPAddresses":null,"SecondaryIPv6Addresses":null,"IsAnonymousEndpoint":false,"HasSwarmEndpoint":false},"LogPath":"","Name":"/mysql_test","Driver":"overlay2","MountLabel":"system_u:object_r:svirt_sandbox_file_t:s0:c570,c746","ProcessLabel":"system_u:system_r:svirt_lxc_net_t:s0:c570,c746","RestartCount":0,"HasBeenStartedBefore":true,"HasBeenManuallyStopped":false,"MountPoints":{
    # 这里开始
    "/etc/mysql/conf.d/mysql.cnf":{"Source":"/usr/local/mysql_config/my.cnf","Destination":"/etc/mysql/conf.d/mysql.cnf","RW":true,"Name":"","Driver":"","Type":"bind","Spec":{"Type":"bind","Source":"/usr/local/mysql_config/my.cnf","Target":"/etc/mysql/conf.d/mysql.cnf"},"SkipMountpointCreation":false}
# 这里结束
,"/var/lib/mysql":{"Source":"","Destination":"/var/lib/mysql","RW":true,"Name":"a1279850c438d1049607b82940ef287eed0e8c398f2d834cf174985fdb2f475a","Driver":"local","Type":"volume","ID":"6b7903d1aeab2d3b418e6f0993bd8324cfa671582a9dc70fad4f0d7af3fae070","Spec":{},"SkipMountpointCreation":false}},"SecretReferences":null,"AppArmorProfile":"","HostnamePath":"/var/lib/docker/containers/97cc3f4e08fd0e74662cf24f3117465111310a5f2efb7c1e0e97ee9c2a8d5845/hostname","HostsPath":"/var/lib/docker/containers/97cc3f4e08fd0e74662cf24f3117465111310a5f2efb7c1e0e97ee9c2a8d5845/hosts","ShmPath":"/var/lib/docker/containers/97cc3f4e08fd0e74662cf24f3117465111310a5f2efb7c1e0e97ee9c2a8d5845/shm","ResolvConfPath":"/var/lib/docker/containers/97cc3f4e08fd0e74662cf24f3117465111310a5f2efb7c1e0e97ee9c2a8d5845/resolv.conf","SeccompProfile":"","NoNewPrivileges":false}

# 注意:这里主要修改MountPoint里的配置,这里我已经添加了/usr/local/mysql_config/my.cnf,参考示例去配置

 启动Docker服务和容器:

# 启动Docker
systemctl start docker

# 启动容器
docker start mysql_test

# 查看挂载目录是否改变
docker inspect mysql_test
## 挂载信息
        "Mounts": [
            {
                "Type": "volume",
                "Name": "a1279850c438d1049607b82940ef287eed0e8c398f2d834cf174985fdb2f475a",
                "Source": "/var/lib/docker/volumes/a1279850c438d1049607b82940ef287eed0e8c398f2d834cf174985fdb2f475a/_data",
                "Destination": "/var/lib/mysql",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            },
            ## 已改变
            {
                "Type": "bind",
                "Source": "/usr/local/mysql_config/my.cnf",
                "Destination": "/etc/mysql/conf.d/mysql.cnf",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ]

问题二:systemctl stop docker 停止docker服务时报错,这是由于docker有调用启动服务模式,导致你停止docker服务之后,自动重启了

 解决方案:

①你可以删除 /lib/systemd/system/docker.socket
从docker中 docker.service 文件 删除 fd://,即remove -H fd://

②如果不想被访问时自动启动服务
输入命令:sudo systemctl stop docker.socket

问题三:docker是否可以装一个环境,并在这个环境中安装其他软件?

解决方案:

是可以的,可以只安装一个centos,之后进入这个容器安装所需要的软件,配置好挂载路径、端口映射即可

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值