Docker进阶
Docker进阶
commit 镜像
docker commit 提交容器成为新的副本
# 命令和git原理类似
docker commit -m="提交描述的信息" -a="作者" 容器id 目标镜像名:TAG
# 测试
C:\Users\watson>docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a6c2193d3a16 tomcat "/bin/bash" 9 minutes ago Exited (137) About a minute ago busy_khayyam
C:\Users\watson>docker commit -m="add webapps application" -a="watson" a6c2193d3a16 tomcat:test1.0
sha256:e31281047195b23e93f9c7e54d4e4d94c7b4b469625f7870e86570a3f68e7976
C:\Users\watson>docker images -a
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat test1.0 e31281047195 9 seconds ago 478MB
tomcat latest 1dad8c5497f9 4 weeks ago 474MB
ubuntu latest 6b7dfa7e8fdb 4 weeks ago 77.8MB
centos latest 5d0da3dc9764 16 months ago 231MB
# commit提交,保存当前容器的状态,生成一个镜像,类似于虚拟机的“快照”
容器数据卷
容器之间数据共享的技术,Docker容器中产生的数据,同步到本地。
目录挂载,将容器内的目录,挂载到本地。
容器的持久化和同步操作,容器间也可以数据共享。
使用数据卷
方式一:直接使用命令来挂载 -v
docker run -it -v 主机目录:容器目录
# 测试
# 指定目录挂载
C:\Users\watson>docker run -it -v C:\Users\watson\ceshi:/home centos /bin/bash
# 查看挂载情况 docker inspect 容器id
C:\Users\watson>docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1da7f13ea2e5 centos "/bin/bash" 16 minutes ago Up 16 minutes keen_haibt
C:\Users\watson>docker inspect 1da7f13ea2e5
···
"Mounts": [
{
"Type": "bind",
"Source": "C:\\Users\\watson\\ceshi",
"Destination": "/home",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
···
测试安装mysql
# 获取镜像
C:\Users\watson>docker pull mysql:8.0
# 运行容器,数据挂载 # 安装启动mysql需要设置密码
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
--name 容器名字
C:\Users\watson>docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw mysql --name mysql01 mysql:8.0
具名挂载和匿名挂载
# 查看所有的 volume(卷) 的情况
C:\Users\watson>docker volume --help
Usage: docker volume COMMAND
Manage volumes
Commands:
create Create a volume
inspect Display detailed information on one or more volumes
ls List volumes
prune Remove all unused local volumes
rm Remove one or more volumes
# 匿名挂载
-v 容器内路径
C:\Users\watson>docker run -d -P --name nginx01 -v /etc/nginx nginx
2dbd04c485036390f6321f242f65542e0c0666828d1909bd74aa9db44977704b
C:\Users\watson>docker volume ls
DRIVER VOLUME NAME
local bb99165769e29b6024d7b351c2ff8f3e3ff2a48b57a998aa7a34f44bf252c284
# 具名挂载
-v 卷名:容器内路径
C:\Users\watson>docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
577edeea748f5d0fb062ee18c90f2891925236d17ec20ef9c22bdf7c062bfc4f
C:\Users\watson>docker volume ls
DRIVER VOLUME NAME
local bb99165769e29b6024d7b351c2ff8f3e3ff2a48b57a998aa7a34f44bf252c284
local juming-nginx
C:\Users\watson>docker volume inspect juming-nginx
[
{
"CreatedAt": "2023-01-13T10:56:03Z",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
"Name": "juming-nginx",
"Options": null,
"Scope": "local"
}
]
Linux中所有的docker容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/xxx/_data
中。
具名挂载可以方便找到对应的卷,推荐使用具名挂载
# 判断是'具名挂载'还是'匿名挂载',还是'指定路径'挂载
-v 容器内路径 # 匿名挂载
-v 卷名:容器内路径 # 具名挂载
-v 宿主机路径:容器内路径 # 指定路径挂载
拓展:
# 通过 -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
# ro,说明这个路径里的内容只能宿主机改写,容器内部没有权限改写
初识Dockerfile
Dockerfile 就是用来构建docker镜像的构建文件命令脚本。
通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个个的命令,每个命令都是一层。
方式二 docker build -f dockerfile01 -t watson-centos:1.0 .
# 创建一个dockerfile文件,名字随机,建议dockerfile
# 文件中的内容 指令(大写) 参数
FROM centos
VOLUME ["volume01","volume02"] # 匿名挂载
CMD echo "----end----"
CMD /bin/bash
# 每个命令都是镜像的一层
E:\sh>docker build -f dockerfile01 -t watson-centos:1.0 .
[+] Building 0.2s (5/5) FINISHED
=> [internal] load build definition from dockerfile01 0.1s
=> => transferring dockerfile: 125B 0.0s
=> [internal] load .dockerignore 0.1s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/centos:latest 0.0s
=> [1/1] FROM docker.io/library/centos 0.0s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:bcb7b9d022595d87e4f374a55119c8e2e4933dd784edc7ca0ca447c4d8abff2f 0.0s
=> => naming to docker.io/library/watson-centos:1.0 0.0s
E:\sh>docker images -a
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest a99a39d070bf 2 days ago 142MB
tomcat latest 1dad8c5497f9 4 weeks ago 474MB
ubuntu latest 6b7dfa7e8fdb 5 weeks ago 77.8MB
mysql 8.0 7484689f290f 5 weeks ago 538MB
centos latest 5d0da3dc9764 16 months ago 231MB
watson-centos 1.0 bcb7b9d02259 16 months ago 231MB
数据卷容器
两个或者多个容器之间实现数据共享。
# 测试
docker run -it --name docker02 bcb7b9d02259
C:\Users\watson>docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3ecbe1bb61c0 bcb7b9d02259 "/bin/sh -c /bin/bash" 37 seconds ago Up 36 seconds docker02
d5a92ec01559 bcb7b9d02259 "/bin/sh -c /bin/bash" 3 minutes ago Up 3 minutes docker01

# 测试
docker run -it --name docker02 --volumes-from docker01 bcb7b9d02259
多个MySQL实现数据共享
C:\Users\watson>docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw mysql --name mysql01 mysql:8.0
C:\Users\watson>docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=my-secret-pw mysql --name mysql02 --volumes-from mysql01 mysql:8.0
# 这个时候,可以实现连个容器数据同步
Dockerfile
Dockerfile是用来构建docker镜像的文件,命令参数脚本。
构建步骤:
1、编写一个 dockerfile 文件
2、docker build 构建成为一个镜像
3、docker run 运行镜像
4、docker push 发布镜像(DockerHub、阿里云镜像仓库)
Dockerfile 构建过程
基础知识
1、每个保留关键字(指令)都必须是大写字母
2、执行从上到下顺序执行
3、# 表示注释
4、每一个指令都会创建提交一个新的镜像层,并进行提交
Dockerfile:构建文件,定义一切的步骤,源代码
DockerImages:通过Dockerfile构建生成的镜像,最终发布和运行产品
Docker容器:容器就是镜像运行起来提供服务
创建自己的镜像
# 官方示例
# 创建centos的 dockerfile 文件
FROM scratch
ADD centos-7-x86_64-docker.tar.xz /
LABEL \
org.label-schema.schema-version="1.0" \
org.label-schema.name="CentOS Base Image" \
org.label-schema.vendor="CentOS" \
org.label-schema.license="GPLv2" \
org.label-schema.build-date="20201113" \
org.opencontainers.image.title="CentOS Base Image" \
org.opencontainers.image.vendor="CentOS" \
org.opencontainers.image.licenses="GPL-2.0-only" \
org.opencontainers.image.created="2020-11-13 00:00:00+00:00"
CMD ["/bin/bash"]
创建自己的centos镜像
# 1、编写dockerfile文件
root@MSI:/home/dockerfile# touch mydockerfile
FROM centos:7
LABEL \
org.label-schema.schema-version="1.0" \
org.label-schema.name="CentOS Base Image" \
org.label-schema.vendor="CentOS" \
org.label-schema.license="GPLv2" \
org.label-schema.build-date="20201113" \
org.opencontainers.image.title="CentOS Base Image" \
org.opencontainers.image.vendor="CentOS" \
org.opencontainers.image.licenses="GPL-2.0-only" \
org.opencontainers.image.created="2020-11-13 00:00:00+00:00"
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
# 2、通过这个文件构建镜像
# 注意!!!最后面有个“.”
# 命令 docker build -f dockerfile文件路径 -t 镜像名:版本号 .
root@MSI:/home/dockerfile# docker build -f mydockerfile -t mycentos:0.1 .
CMD和ENTRYPOINT的区别
CMD # 指定这个容器启动时要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT # 指定这个容器启动时要运行的命令,可以追加命令
测试 CMD
# 编写dockerfile文件
root@MSI:/home/dockerfile# vim dockerfile-cmd
FROM centos
CMD ["ls","-a"]
# 构建镜像
root@MSI:/home/dockerfile# docker build -f dockerfile-cmd -t centos-cmd .
# run运行
root@MSI:/home/dockerfile# docker run centos-cmd
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
# 测试
root@MSI:/home/dockerfile# docker run centos-cmd -l
docker: Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "-l": executable file not found in $PATH: unknown.
ERRO[0000] error waiting for container: context canceled
测试 ENTRYPOINT
# 编写dockerfile文件
root@MSI:/home/dockerfile# vim dockerfile-entrypoint
ENTRYPOINT ["ls","-a"]
# 构建镜像
root@MSI:/home/dockerfile# docker build -f dockerfile-entrypoint -t centos-entrypoint .
# run运行
root@MSI:/home/dockerfile# docker run centos-entrypoint
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
# 测试
root@MSI:/home/dockerfile# docker run centos-entrypoint -l
total 56
drwxr-xr-x 1 root root 4096 Feb 2 12:32 .
drwxr-xr-x 1 root root 4096 Feb 2 12:32 ..
-rwxr-xr-x 1 root root 0 Feb 2 12:32 .dockerenv
lrwxrwxrwx 1 root root 7 Nov 3 2020 bin -> usr/bin
drwxr-xr-x 5 root root 340 Feb 2 12:32 dev
drwxr-xr-x 1 root root 4096 Feb 2 12:32 etc
drwxr-xr-x 2 root root 4096 Nov 3 2020 home
lrwxrwxrwx 1 root root 7 Nov 3 2020 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Nov 3 2020 lib64 -> usr/lib64
drwx------ 2 root root 4096 Sep 15 2021 lost+found
drwxr-xr-x 2 root root 4096 Nov 3 2020 media
CMD->覆盖,ENTRYPOINT->追加
发布自己的镜像
发布到Dockerhub
1、地址Dockerhub注册账号
2、确定账号可以登陆、
3、在服务器上提交镜像
root@MSI:/home/dockerfile# 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
4、登录完毕就可以提交镜像 docker push
# 步骤
1、docker tag 待提交镜像名:标签 dockerhub用户名/镜像名:标签
2、docker push dockerhub用户名/镜像名:标签
root@MSI:/home/dockerfile# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
pycentos 0.1 1275e9d34104 About an hour ago 687MB
root@MSI:/home/dockerfile# docker tag pycentos:0.1 watson0408/pycentos:1.0
root@MSI:/home/dockerfile# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
watson0408/pycentos 1.0 1275e9d34104 About an hour ago 687MB
pycentos 0.1 1275e9d34104 About an hour ago 687MB
root@MSI:/home/dockerfile# docker push watson0408/pycentos:1.0
The push refers to repository [docker.io/watson0408/pycentos]
af9ba76fdf85: Pushed
e05d3910ad7d: Pushed
174f56854903: Mounted from watson0408/mycentos
发布到阿里云镜像
1、登录阿里云
2、阿里云镜像服务
3、创建命名空间
4、创建容器镜像
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!