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

![测试](https://images.cnblogs.com/cnblogs_com/watson04/1754524/o_230115114117_屏幕截图 2023-01-15 194101.jpg)

# 测试
docker run -it --name docker02 --volumes-from docker01 bcb7b9d02259

测试2

多个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容器:容器就是镜像运行起来提供服务


dockerfile

创建自己的镜像

# 官方示例
# 创建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、创建容器镜像

Docker全流程

posted @ 2023-01-10 20:49  watsono  阅读(68)  评论(0编辑  收藏  举报