[步骤] Docker 自定义镜像的创建

注意:

在创建 Docker 自定义镜像之前,要先安装 Docker

正文:

步骤一:基于现有的镜像进行手动配置后再创建

1.1 加载并启动 Docker 镜像

# docker run -it centos


补充:
1) 这里以加载并启动 centos 镜像为例
2) -t 代表要开启一个伪终端
3) -i 代表要保持打开并且可以进行标准输入

1.2 对镜像里的系统进行操作并退出

(步骤略)

1.3 显示刚刚创建的容器

# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
d5cd7496a72c        centos              "/bin/bash"              37 seconds ago      Exited (0) 14 seconds ago                       ecstatic_bassi

(补充:这里以显示到的容器 ID 是 d5cd7496a72c)

1.4 将刚刚创建的容器转换成新镜像

# docker commit d5cd7496a72c newos:v1 

(补充:这里以通过 d5cd7496a72c 生成 v1 版本的 newos 为例)

1.5 测试刚刚创建的新镜像是否可用

# docker run -it newos

(补充:这里以运行 newos 镜像为例)

步骤二:基于现有的镜像使用配置文件修改后在创建

2.1 创建使用镜像配置文件的目录

# mkdir -p ~/newhttpd

(补充:这里以创建 newhttpd 目录为例)

2.3 将 YUM 的从库文件放到镜像配置文件的目录

# cp /etc/yum.repos.d/local.repo ~/newhttpd

(补充:这里以将在次环境里可用的 yum 配置文件 /etc/yum.repos.d/local.repo 拷贝到 ~/newhttpd/ 为例)

2.3 创建镜像配置文件

# touch ~/newhttpd/Dockerfile

(补充:这里以创建 ~/newhttpd/Dockerfile 文件为例)

2.4 编辑镜像配置文件

# vim ~/newhttpd/Dockerfile

创建以下内容:

FROM centos:latest
RUN yum -y install httpd
ENV EnvironmentFile=/etc/sysconfig/httpd
WORKDIR /var/www/html/
RUN echo "test" > /var/www/html/index.html
EXPOSE 80
CMD ["/usr/sbin/httpd", "-DFOREGROUND"]


补充:
1) FROM 要从哪 1 个镜像克隆而来,这里以从 centos:latest 克隆为例
2) MAINTAINER 要说明的信息
3) ENV 要设置的环境变量,这里以使用以下文件作为配置文件为例:

/etc/sysconfig/httpd

4) WORKDIR 要设置的工作目录,这里以使用以下目录作为工作目录为例:
/var/www/html/
5) RUN 在生成镜像时要执行的命令,可以有多条,这里以执行以下命令为例:

echo "test" > /var/www/html/index.html

6) CMD 容器启动时要执行的命令,只能有一条,这里以执行以下命令为例:

"/usr/sbin/httpd", "-DFOREGROUND"

7) ADD 要复制的文件
8) EXPOSE 要开放的端口,这里以使用 80 端口为例

2.5 使用刚刚创建的镜像配置文件创建新的镜像

# docker build -t newos:httpd ~/newhttpd

(补充:这里以通过 ~/newhttpd 里的配置信息生成为名 newos 版本为 httpd 的容器为例)

2.6 测试刚刚创建的新镜像是否可用

# docker run -d newos:http

(补充:这里以测试名为 newos 版本为 httpd 的容器为例)

[步骤] Docker 虚拟网桥的创建

注意:

在创建 Docker 虚拟网桥之前,要先安装 Docker

正文:

步骤一:创建 Docker 的虚拟网桥

# docker network create --subnet=172.16.0.0/24 dockernetwork

(补充:这里以创建网段为 172.16.0.0/24 名为 dockernetwork 为例)

步骤二:显示创建的虚拟网桥

# docker network list

步骤三:使用创建的虚拟网桥加载并启动 Docker 镜像

# docker run --network=dockernetwork -id nginx

(补充:这里以使用 dockernetwork 开启 nginx 镜像为例)

步骤四:创建端口映射

# docker run -p 8080:80 -id nginx

(补充:这里以将宿主机的 8080 端口映射到 nginx 容器的 80 端口为例)

步骤五:显示端口映射是否实现

# curl 127.0.0.1:8080

(补充:这里以显示宿主机的 8080 端口为例)

[步骤] Docker 容器的使用

注意:

在使用 Docker 容器之前,要先安装 Docker

正文:

内容一:加载并启动 Docker 镜像

1.1 在前台启动 Docker 镜像

1.1.1 在非交互模式下在前台加载并启动 Docker 镜像
1.1.1.1 在非交互模式下在前台加载并启动 Docker 镜像但不执行命令
1.1.1.1.1 在非交互模式下在前台加载并启动 Docker 镜像但不执行命令的格式
# docker run <image ID or image name>


补充:
1) 如果使用镜像名无效就使用镜像的 ID
2) 如果镜像的 ID 只有 1 个 9 开头,那就只用使用 9 ,如果有 94 和 95 开头的镜像,就需要使用 94 或 95,反正需要保证它们的唯一性,否则会一次性操作所有相关的镜像
3) 镜像启动了之后就变成容器了

1.1.1.1.2 在非交互模式下在前台加载并启动 Docker 镜像但不执行命令的案例
# docker run centos

(补充:这里以非交互式加载并启动 centos 镜像 为例)

1.1.1.2 在非交互模式下在前台加载并启动 Docker 镜像同时执行命令
1.1.1.2.1 在非交互模式下在前台加载并启动 Docker 镜像同时执行命令的格式
# docker run <image ID or image name> <command in image>


补充:
1) 如果使用镜像名无效就使用镜像的 ID
2) 如果镜像的 ID 只有 1 个 9 开头,那就只用使用 9 ,如果有 94 和 95 开头的镜像,就需要使用 94 或 95,反正需要保证它们的唯一性,否则会一次性操作所有相关的镜像
3) 镜像启动了之后就变成容器了

1.1.1.2.2 在非交互模式下在前台加载并启动 Docker 镜像同时执行命令的案例
# docker run centos /bin/echo 'Hello world'
Hello world

(补充:这里以非交互式加载并启动 centos 镜像,并执行 /bin/echo ‘Hello world’ 为例)

1.1.2 在交互模式下在前台加载并启动 Docker 镜像
1.1.2.1 在交互模式下在前台加载并启动 Docker 镜像的格式
# docker run centos -t -i <image ID or image name>


补充:
1) 如果使用镜像名无效就使用镜像的 ID
2) 如果镜像的 ID 只有 1 个 9 开头,那就只用使用 9 ,如果有 94 和 95 开头的镜像,就需要使用 94 或 95,反正需要保证它们的唯一性,否则会一次性操作所有相关的镜像
3) 镜像启动了之后就变成容器了
4) -i 代表要保持打开并且可以进行标准输入
5) -t 代表要开启一个伪终端

1.1.2.2 在交互模式下在前台启动 Docker 镜像的案例
# docker run -t -i centos
[root@1a7d6f4fd45c /]# exit
exit


补充:
1) 这里以交互式加载并启动 centos 镜像,再退出为例
2) -i 代表要保持打开并且可以进行标准输入
3) -t 代表要开启 1 个伪终端
4) 默认会进入 bash 环境

或者:

# docker run -it centos
 bash
[root@1a7d6f4fd45c /]# exit
exit


补充:
1) 这里以交互式加载并启动 centos 镜像,再退出为例
2) -i 代表要保持打开并且可以进行标准输入
3) -t 代表要开启一个伪终端
4) bash 代表通过 bash 命令来进入 bash 环境

1.2 在后台启动 Docker 镜像

1.2.1 在后台启动 Docker 镜像的格式
# docker run -tid <image ID or image name>


补充:
1) 如果使用镜像名无效就使用镜像的 ID
2) 如果镜像的 ID 只有 1 个 9 开头,那就只用使用 9 ,如果有 94 和 95 开头的镜像,就需要使用 94 或 95,反正需要保证它们的唯一性,否则会一次性操作所有相关的镜像
3) 镜像启动了之后就变成容器了
4) -i 代表要保持打开并且可以进行标准输入
5) -t 代表要开启 1 个伪终端
6) -d 代表放在后台运行

1.2.2 在后台启动 Docker 镜像的案例
# docker run -itd centos


补充:
1) 这里以在后台加载并启动 centos 镜像为例
2) -i 代表要保持打开并且可以进行标准输入
3) -t 代表要开启 1 个伪终端
4) -d 代表放在后台运行

步骤二:将容器的端口号映射宿主机的端口号

2.1 将容器的端口号映射宿主机的端口号的格式

# docker run -d -p <the port number of the host>:<the port number of the container> -it <image ID or image name>


补充:
1) 需要在加载并启动镜像时执行此步骤
2) 如果镜像的 ID 只有一个 9 开头,那就只用使用 9 ,如果有 94 和 95 开头的容器,就需要使用 94 或 95,反正需要保证它们的唯一性,否则会一次性操作所有相关的镜像
3) 镜像启动了之后就变成容器了
4) -d 代表放在后台运行
5) -p 代表要做端口映射
6) -i 代表要保持打开并且可以进行标准输入
7) -t 代表要开启 1 个伪终端

2.2 将容器的端口映射宿主机的端口的案例

# docker run -d -p 8080:80 -it nginx

(补充:这里以启动 nginx 镜像,并将宿主机的 8080 端口映射到容器的 80 端口为例)

步骤三:将宿主机上的文件或目录映射到容器的文件或目录里

3.1 将宿主机上的文件或目录映射到容器的文件或目录里的格式

# docker run -d -v <a file or directory on the host>:<a file or directory on the container> -it <image ID or image name>


补充:
1) 需要在加载并启动镜像时执行此步骤
2) 如果镜像的 ID 只有一个 9 开头,那就只用使用 9 ,如果有 94 和 95 开头的容器,就需要使用 94 或 95,反正需要保证它们的唯一性,否则会一次性操作所有相关的镜像
3) 镜像启动了之后就变成容器了
4) -d 代表放在后台运行
5) -v 代表要做文件或目录映射
6) -i 代表要保持打开并且可以进行标准输入
7) -t 代表要开启 1 个伪终端

3.2 将宿主机上的文件或目录映射到容器的文件或目录里的案例

# docker run  -d -v /tmp/web:/var/www/html -it nginx

(补充:这里以启动 nginx 镜像,并将宿主机的目录/tmp/web 映射到容器的目录 /var/www/html 为例)

步骤四:显示容器列表

4.1 显示正在运行的容器列表

# docker ps

4.2 显示所有加载并运行过或正在运行的容器列表

# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
e145ad3588ed        centos              "/bin/bash"         19 seconds ago      Exited (0) 17 seconds ago                       thirsty_mcnulty

步骤五:显示容器的信息

5.1 显示容器在运行的进程

# docker top <image ID or image name>


补充:
1) 如果使用镜像名无效就使用镜像的 ID
2) 如果镜像的 ID 只有一个 9 开头,那就只用使用 9 ,如果有 94 和 95 开头的镜像,就需要使用 94 或 95,反正需要保证它们的唯一性,否则会一次性操作所有相关的镜像

5.2 显示容器的 IP 地址

# docker inspect -f '{{.NetworkSettings.IPAddress}}' <image ID or image name>


补充:
1) 如果使用镜像名无效就使用镜像的 ID
2) 如果镜像的 ID 只有 1 个 9 开头,那就只用使用 9 ,如果有 94 和 95 开头的镜像,就需要使用 94 或 95,反正需要保证它们的唯一性,否则会一次性操作所有相关的镜像

5.3 显示容器的 MAC 地址

# docker inspect -f '{{.NetworkSettings.MacAddress}}' <image ID or image name>


补充:
1) 如果使用镜像名无效就使用镜像的 ID
2) 如果镜像的 ID 只有 1 个 9 开头,那就只用使用 9 ,如果有 94 和 95 开头的镜像,就需要使用 94 或 95,反正需要保证它们的唯一性,否则会一次性操作所有相关的镜像

步骤六:连接某 1 个容器

6.1 连接某 1 个容器但是退出时会关闭这个容器

# docker attach <image ID or image name>


补充:
1) 如果使用镜像名无效就使用镜像的 ID
2) 如果镜像的 ID 只有 1 个 9 开头,那就只用使用 9 ,如果有 94 和 95 开头的镜像,就需要使用 94 或 95,反正需要保证它们的唯一性,否则会一次性操作所有相关的镜像

6.2 连接某 1 个容器且退出时不会关闭这个容器

# docker exec -it <image ID or image name> /bin/bash


补充:
1) 如果使用镜像名无效就使用镜像的 ID
2) -i 代表要保持打开并且可以进行标准输入
3) -t 代表要开启 1 个伪终端
4) 如果镜像的 ID 只有一个 9 开头,那就只用使用 9 ,如果有 94 和 95 开头的镜像,就需要使用 94 或 95,反正需要保证它们的唯一性,否则会一次性操作所有相关的镜像

6.3 以非交互的形式连接 1 个容器

# docker exec -t <image ID or image name> <command>


补充:
1) 如果使用镜像名无效就使用镜像的 ID
2) -t 代表要开启 1 个伪终端
3) 如果镜像的 ID 只有一个 9 开头,那就只用使用 9 ,如果有 94 和 95 开头的镜像,就需要使用 94 或 95,反正需要保证它们的唯一性,否则会一次性操作所有相关的镜像

步骤七:重启某 1 个容器

# docker restart <container ID or container name>


补充:
1) 如果使用容器名无效就使用容器的 ID
2) 如果容器的 ID 只有 1 个 9 开头,那就只用使用 9 ,如果有 94 和 95 开头的容器,就需要使用 94 或 95,反正需要保证它们的唯一性,否则会一次性操作所有相关的镜像

步骤八:启动某 1 个已经停止的容器

# docker stop <container ID or container name>


补充:
1) 如果使用容器名无效就使用容器的 ID
2) 如果镜像的 ID 只有 1 个 9 开头,那就只用使用 9 ,如果有 94 和 95 开头的容器,就需要使用 94 或 95,反正需要保证它们的唯一性,否则会一次性操作所有相关的镜像

步骤九:删除某 1 个容器

# docker rm <container ID or container name>


补充:
1) 如果使用容器名无效就使用容器的 ID
2) 如果容器的 ID 只有 1 个 9 开头,那就只用使用 9 ,如果有 94 和 95 开头的容器,就需要使用 94 或 95,反正需要保证它们的唯一性,否则会一次性操作所有相关的镜像

[步骤] Docker 官方镜像的下载

注意:

在下载 Docker 官方镜像之前,要先安装 Docker

正文:

步骤一:使用 Docker 官方的代理加速器

1.1 修改 Docker 的配置文件

# vim /etc/docker/daemon.json

将以下内容:

......
}

修改为:

......
  "registry-mirrors": ["https://registry.docker-cn.com"],
}


补充:
1) 此步骤是为了避免因网络问题导致下载官方 Docker 镜像不成功的情况
2) 主要目的是为了将 “registry-mirrors”: [“https://registry.docker-cn.com”], 放在大括号 “{}” 内

1.2 重启 Docker 服务

# systemctl restart docker

步骤二:显示本地已有的 Docker 镜像

# docker images

步骤三:查找某 1 个官方库里的 Docker 镜像

3.1 查找某 1 个官方库里的 Docker 镜像的格式

# docker search <image> 

3.2 查找某 1 个官方库里的 Docker 镜像名的案例

# docker search centos


补充:
1) 这里以查找 centos 镜像为例
2) 这里默认会从公网 docker.io 的官方镜像库里查找
3) 如果在查找的 DESCRIPTION 里出现了类似 The official build 的字样,则表示这个镜像是由官方制作的

步骤四:下载某 1 个官方库里的 Docker 镜像

4.1 下载某 1 个官方库里的 Docker 镜像的格式

4.1.1 下载某 1 个官方库里最新版的 Docker 镜像的格式
# docker pull <image>

或者:

# docker pull <image>:latest
4.1.2 下载某 1 个官方库里旧的指定版的 Docker 镜像的格式
# docker pull <image>:<version>

4.2 下载某 1 个官方库里的 Docker 镜像的案例

4.2.1 下载某 1 个官方库里最新版的 Docker 镜像的案例
# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
3c72a8ed6814: Pull complete 
Digest: sha256:76d24f3ba3317fa945743bb3746fbaf3a0b752f10b10376960de01da70685fbd
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest


补充:
1) 这里以下载 centos 镜像为例
2) 这里默认会从公网 docker.io 的官方镜像库里下载

4.2.2 下载某 1 个官方库里旧的指定版的 Docker 镜像的案例
# docker pull nginx:1
1: Pulling from library/nginx
d121f8d1c412: Downloading [============>                                      ]  6.728MB/27.09MB
ebd81fc8c071: Downloading [===============>                                   ]  8.289MB/26.4MB
655316c160af: Download complete                                                                                                                                 d121f8d1c412: Pull complete 
ebd81fc8c071: Pull complete 
655316c160af: Pull complete 
d15953c0e0f8: Pull complete 
2ee525c5c3cc: Pull complete 
Digest: sha256:c628b67d21744fce822d22fdcc0389f6bd763daac23a6b77147d0712ea7102d0
Status: Downloaded newer image for nginx:1
docker.io/library/nginx:1


补充:
1) 这里以下载 nginx 的 1 版本为例
2) 这里默认会从公网 docker.io 的官方镜像库里下载

步骤五:显示官方库里 Docker 镜像是否成功下载到本地

# docker images
REPOSITORY                                    TAG                 IMAGE ID            CREATED             SIZE
centos                                        latest              0d120b6ccaa8        7 weeks ago         215MB
nginx                                         1                   7e4d58f0e5f3        3 weeks ago         133MB

步骤六:删除 Docker 本地镜像

# docker rmi <image>

步骤七:上传 Docker 本地镜像

# docker push <image>

(补充:这里默认会往公网 docker.io 的官方镜像库里上传)

[步骤] MariaDB 的安装

步骤一:系统环境要求

服务器系统要配置好可用的软件源

2.1 CentOS&RHEL 安装 MariaDB

# yum -y install mariadb mariadb-devel mariadb-server

2.2 openSUSE&SUSE 安装 MariaDB

# zypper -n mariadb mariadb-devel mariadb-server