注意:
在导入和导出本地 Docker 镜像之前,要先安装 Docker
正文:
步骤一:导出 Docker 本地镜像
# docker save centos:latest > centos.tar
(补充:将 latest 版本的 centos Docker 镜像导出为 centos.tar)
步骤二:导入 Docker 本地镜像
# docker load
(补充:导入 centos.tar)
在导入和导出本地 Docker 镜像之前,要先安装 Docker
# docker save centos:latest > centos.tar
(补充:将 latest 版本的 centos Docker 镜像导出为 centos.tar)
# docker load
(补充:导入 centos.tar)
在搭建私有 Docker 镜像仓库之前,要先安装 Docker
# docker pull registry
# docker run -d -p 5000:5000 registry
43c6b8c581e9039c8b7df12bb11a89dbdc9ff0b7e00fd6d345068aa9b5af7d9f
(补充:这里以使用宿主机的 5000 端口为例)
# curl 127.0.0.1:5000/v2/
{}
(补充:这里以显示 127.0.0.1:5000/v2/ 为例,出现大括号 “{}” 则表示搭建成功)
# docker tag centos:latest 127.0.0.1:5000/v2/centos:latest
(补充:这里以将现有的 centos:latest 镜像打成 127.0.0.1:5000/v2/centos:latest 标签为例)
# docker push 127.0.0.1:5000/centos:latest
The push refers to repository [127.0.0.1:5000/centos]
291f6e44771a: Pushed
latest: digest: sha256:fc4a234b91cc4b542bac8a6ad23b2ddcee60ae68fc4dbd4a52efb5f1b0baad71 size: 529
(补充:这里以上传 127.0.0.1:5000/v2/centos:latest 为例)
# curl http://127.0.0.1:5000/v2/_catalog
{"repositories":["centos"]}
(补充:这里以显示 127.0.0.1:5000/v2/ 为例)
# curl http://127.0.0.1:5000/v2/centos/tags/list
{"name":"centos","tags":["latest"]}
(补充:这里以显示 http://127.0.0.1:5000/v2 上 centos 镜像的版本为例)
# docker pull 127.0.0.1:5000/v2/centos:latest
latest: Pulling from v2/centos
Digest: sha256:fc4a234b91cc4b542bac8a6ad23b2ddcee60ae68fc4dbd4a52efb5f1b0baad71
Status: Image is up to date for 127.0.0.1:5000/v2/centos:latest
127.0.0.1:5000/v2/centos:latest
(补充:这里以下载 127.0.0.1:5000/v2/centos:latest 为例)
在创建 Docker 自定义镜像之前,要先安装 Docker
# docker run -it centos
(
补充:
1) 这里以加载并启动 centos 镜像为例
2) -t 代表要开启一个伪终端
3) -i 代表要保持打开并且可以进行标准输入
)
(步骤略)
# 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)
# docker commit d5cd7496a72c newos:v1
(补充:这里以通过 d5cd7496a72c 生成 v1 版本的 newos 为例)
# docker run -it newos
(补充:这里以运行 newos 镜像为例)
# mkdir -p ~/newhttpd
(补充:这里以创建 newhttpd 目录为例)
# cp /etc/yum.repos.d/local.repo ~/newhttpd
(补充:这里以将在次环境里可用的 yum 配置文件 /etc/yum.repos.d/local.repo 拷贝到 ~/newhttpd/ 为例)
# touch ~/newhttpd/Dockerfile
(补充:这里以创建 ~/newhttpd/Dockerfile 文件为例)
# 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 端口为例
)
# docker build -t newos:httpd ~/newhttpd
(补充:这里以通过 ~/newhttpd 里的配置信息生成为名 newos 版本为 httpd 的容器为例)
# docker run -d newos:http
(补充:这里以测试名为 newos 版本为 httpd 的容器为例)
在创建 Docker 虚拟网桥之前,要先安装 Docker
# docker network create --subnet=172.16.0.0/24 dockernetwork
(补充:这里以创建网段为 172.16.0.0/24 名为 dockernetwork 为例)
# docker network list
# 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 run <image ID or image name>
(
补充:
1) 如果使用镜像名无效就使用镜像的 ID
2) 如果镜像的 ID 只有 1 个 9 开头,那就只用使用 9 ,如果有 94 和 95 开头的镜像,就需要使用 94 或 95,反正需要保证它们的唯一性,否则会一次性操作所有相关的镜像
3) 镜像启动了之后就变成容器了
)
# docker run centos
(补充:这里以非交互式加载并启动 centos 镜像 为例)
# docker run <image ID or image name> <command in image>
(
补充:
1) 如果使用镜像名无效就使用镜像的 ID
2) 如果镜像的 ID 只有 1 个 9 开头,那就只用使用 9 ,如果有 94 和 95 开头的镜像,就需要使用 94 或 95,反正需要保证它们的唯一性,否则会一次性操作所有相关的镜像
3) 镜像启动了之后就变成容器了
)
# docker run centos /bin/echo 'Hello world'
Hello world
(补充:这里以非交互式加载并启动 centos 镜像,并执行 /bin/echo ‘Hello world’ 为例)
# 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 代表要开启一个伪终端
)
# 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 环境
)
# 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 代表放在后台运行
)
# docker run -itd centos
(
补充:
1) 这里以在后台加载并启动 centos 镜像为例
2) -i 代表要保持打开并且可以进行标准输入
3) -t 代表要开启 1 个伪终端
4) -d 代表放在后台运行
)
# 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 个伪终端
)
# docker run -d -p 8080:80 -it nginx
(补充:这里以启动 nginx 镜像,并将宿主机的 8080 端口映射到容器的 80 端口为例)
# 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 个伪终端
)
# docker run -d -v /tmp/web:/var/www/html -it nginx
(补充:这里以启动 nginx 镜像,并将宿主机的目录/tmp/web 映射到容器的目录 /var/www/html 为例)
# docker ps
# 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
# docker top <image ID or image name>
(
补充:
1) 如果使用镜像名无效就使用镜像的 ID
2) 如果镜像的 ID 只有一个 9 开头,那就只用使用 9 ,如果有 94 和 95 开头的镜像,就需要使用 94 或 95,反正需要保证它们的唯一性,否则会一次性操作所有相关的镜像
)
# docker inspect -f '{{.NetworkSettings.IPAddress}}' <image ID or image name>
(
补充:
1) 如果使用镜像名无效就使用镜像的 ID
2) 如果镜像的 ID 只有 1 个 9 开头,那就只用使用 9 ,如果有 94 和 95 开头的镜像,就需要使用 94 或 95,反正需要保证它们的唯一性,否则会一次性操作所有相关的镜像
)
# docker inspect -f '{{.NetworkSettings.MacAddress}}' <image ID or image name>
(
补充:
1) 如果使用镜像名无效就使用镜像的 ID
2) 如果镜像的 ID 只有 1 个 9 开头,那就只用使用 9 ,如果有 94 和 95 开头的镜像,就需要使用 94 或 95,反正需要保证它们的唯一性,否则会一次性操作所有相关的镜像
)
# docker attach <image ID or image name>
(
补充:
1) 如果使用镜像名无效就使用镜像的 ID
2) 如果镜像的 ID 只有 1 个 9 开头,那就只用使用 9 ,如果有 94 和 95 开头的镜像,就需要使用 94 或 95,反正需要保证它们的唯一性,否则会一次性操作所有相关的镜像
)
# 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,反正需要保证它们的唯一性,否则会一次性操作所有相关的镜像
)
# docker exec -t <image ID or image name> <command>
(
补充:
1) 如果使用镜像名无效就使用镜像的 ID
2) -t 代表要开启 1 个伪终端
3) 如果镜像的 ID 只有一个 9 开头,那就只用使用 9 ,如果有 94 和 95 开头的镜像,就需要使用 94 或 95,反正需要保证它们的唯一性,否则会一次性操作所有相关的镜像
)
# docker restart <container ID or container name>
(
补充:
1) 如果使用容器名无效就使用容器的 ID
2) 如果容器的 ID 只有 1 个 9 开头,那就只用使用 9 ,如果有 94 和 95 开头的容器,就需要使用 94 或 95,反正需要保证它们的唯一性,否则会一次性操作所有相关的镜像
)
# docker stop <container ID or container name>
(
补充:
1) 如果使用容器名无效就使用容器的 ID
2) 如果镜像的 ID 只有 1 个 9 开头,那就只用使用 9 ,如果有 94 和 95 开头的容器,就需要使用 94 或 95,反正需要保证它们的唯一性,否则会一次性操作所有相关的镜像
)
# docker rm <container ID or container name>
(
补充:
1) 如果使用容器名无效就使用容器的 ID
2) 如果容器的 ID 只有 1 个 9 开头,那就只用使用 9 ,如果有 94 和 95 开头的容器,就需要使用 94 或 95,反正需要保证它们的唯一性,否则会一次性操作所有相关的镜像
)