Docker 学习系列 -

2021/3/20 posted in  Docker

Docker 学习系列 - Dockerfile

Dockerfile 就是用来构建镜像的构建文件,命令脚本。通过这个脚本可以生成镜像,镜像是一层一层的,脚本的每个命令都是一层。

编写精简的 Dockerfile

# 文件中的指令都要大写
FROM centos
VOLUME ["volume01", "volume02"] #直接挂载(常用)
CMD echo "-----end-----"
CMD /bin/bash

Dockerfile指令

FROM        # 基础镜像
MAINTAINER  # 维护者信息,姓名+邮箱
RUN         # 镜像构建的时候需运行的命令
ADD         # 步骤:添加内容
WORKDIR     # 镜像的工作目录
VOLUME      # 挂载的目录
EXPOSE      # 暴露端口配置
CMD         # 指定容器启动的时候要运行的命令
ENTRYPOINT  # 容器启动的时候要运行的命令,可以追加命令 
ONBUILD     # 当构建一个被继承 Dockerfile 这个时候会运行 ONBUILD的命令
COPY        # 类似 ADD 将文件拷贝到镜像中
ENV         # 构建的时候设置环境变量    

构建

sudo docker build -f dockerfile1 -t jake/centos:1.0 .
Sending build context to Docker daemon 2.048 kB
Step 1/4 : FROM centos
 ---> 300e315adb2f
Step 2/4 : VOLUME ["volume01". "volume02"]
 ---> Running in e1167d3e603f
 ---> eece847f4e3e
Removing intermediate container e1167d3e603f
Step 3/4 : CMD echo "-----end-----"
 ---> Running in 71221896866d
 ---> 13be899e589c
Removing intermediate container 71221896866d
Step 4/4 : CMD /bin/bash
 ---> Running in 89680009e04f
 ---> b632a4470d6f
Removing intermediate container 89680009e04f
Successfully built b632a4470d6f

创建的时候,也是分层进行的。

ps:脚本中 FROM 的环境也并不需要本地也存在。

查看卷挂载的路径

# 运行docker,注意需要指定自己的版本号,不然会去拉取latest版本会失败
sudo docker run -it --name jakecentos jake/centos:1.0 /bin/bash
docker inspect jake/centos

#找到Mounts挂载信息,可以看到对应的Source目录就是宿主机的文件目录

"Mounts": [
            {
                "Type": "volume",
                "Name": "2b7dd58637790c120cadb5ea1f57b07b0dcb0aabed1bf90e5115545eb1ed7316",
                "Source": "/var/lib/docker/volumes/2b7dd58637790c120cadb5ea1f57b07b0dcb0aabed1bf90e5115545eb1ed7316/_data",
                "Destination": "volume01",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            },
            {
                "Type": "volume",
                "Name": "88b322a2733e8d4319a4fd172d4d0611d9831c88c984295c9dcf9a67b21d7c2f",
                "Source": "/var/lib/docker/volumes/88b322a2733e8d4319a4fd172d4d0611d9831c88c984295c9dcf9a67b21d7c2f/_data",
                "Destination": "volume02",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],


Dockerfile实战

CMD 和 ENTRYPOINT 的区别

2021/1/31 posted in  Docker

Docker 学习系列 - 数据卷的使用

docker run 的时候使用 -v 命令可以进行内部的目录和宿主机目录进行同步。修改文件可以在宿主机中进行,docker中将会自动同步,当然这个操作反向也是可以进行同步的。

实战安装 MySQL

docker pull mysql:5.7
docker run -d -p 3310:3306 
-v /home/mysql/conf.d:etc/mysql/conf.d 
-v /home/mysql/data:var/lib/mysql 
-e MYSQL_ROOT_PASSWORD=123456
--name mysql01 mysql:5.7

命令回顾能力:

-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
--name 容器名字

即使是docker文件被删除,挂载到本地数据也不会被删除。

具名挂载和匿名挂载

匿名挂载

匿名卷挂载,只是指定了容器内路径,没有指定容器外的路径。这种方式在查看卷的情况的时候会没有名字:

-v 容器内路径
docker run -d -P --name nginx01 -v /etc/nginx nginx

docker volume ls
DRIVER              VOLUME NAME
local               a036e873b5510202ec2f81a7270e3a39a23f86956dbc7c312c8c18b2f578b46b

查看所有卷的情况

docker volume ls

具名挂载

-v 卷名:容器内路径

所有docker容器内的卷,没有指定目录的情况下都是在 /var/lib/docker/volumes/xxxx/_data

如何确定具名挂载还是匿名挂载,还是指定路径挂载

-v 容器内路径    #匿名
-v 卷名:容器内路径 #具名
-v /宿主机路径:容器内路径 #指定路径

卷读写权限

# 通过 -v 容器路径: ro rw 改变读写权限
# ro readonly (容器内部不能操作,只能在宿主机操作数据)
# rw readwrite(默认)
docker run -d -p --name nginx01 -v jake-nginx:/etc/nginx:ro nginx
docker run -d -p --name nginx01 -v jake-nginx:/etc/nginx:rw nginx

数据卷容器

容器之间也可以同步数据,应用场景比如多个 mysql 容器同步数据。

#关键命令
--volumes-from

数据卷容器,其实就是利用这个容器为其他容器提供数据。

docker run -it --name docker02 --volumes-from docker01 jake/centos:1.0

这里的 docker01 在这里称为父容器,也就是数据卷容器。
如此 docker01 和 docker02 之间的数据可以共享。

关于容器删除对于数据共享的问题:如果删除数据卷容器,只要该容器有数据在被其他容器使用,其数据就仍旧可以被其他容器使用。

关于数据共享的实现原理,每个使用共享数据的容器其实都对这份数据拷贝了一份。

实操多个mysql数据共享

docker run -d -p 3310:3306 
-v /home/mysql/conf.d:etc/mysql/conf.d 
-v /home/mysql/data:var/lib/mysql 
-e MYSQL_ROOT_PASSWORD=123456
--name mysql01 mysql:5.7

第二个容器使用共享数据的时候,可以不用再指定卷目录,而是直接使用mysql01中的卷。

docker run -d -p 3310:3306 
-e MYSQL_ROOT_PASSWORD=123456
--name mysql02 
--volumes-from mysql01 mysql:5.7

小结

容器之间的配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。

但是一旦持久化到宿主机之后,数据就不会再被删除了。

2021/1/31 posted in  Docker

Docker 学习系列 - Docker 镜像加载原理

Docker 的镜像实际就是由一层一层的文件系统组成,既UnionFS。

UnionFS (联合文件系统): UnionFS是一种分层、轻量级并且高性能的文件系统,它可以支持对文件系统的修改作为一次提交来一层层的叠加(因此可以看到在 pull Dokcer镜像的时候是分层下载的。),同事可以将不同目录挂载到同一个虚拟文件系统下。Union 文件系统是 Docker 镜像的基础。

镜像可以通过分层来进行继承,基于基础镜像,可以制作各种具体的应用镜像。

Read more   2021/1/23 posted in  Docker

Docker 学习系列 - 部署实践

Docker 官方用于测试的命令,用完即删。

docker run -it --rm nginx

在日常发布的过程中,可能不会每次都进入docker进行操作,需要在容器外部提供一个映射路径,在外部部署项目内部自动同步。

Read more   2021/1/23 posted in  Docker

Docker 学习系列 - 容器常用命令

Read more   2021/1/16 posted in  Docker

进入 Docker 的方式

$ sudo docker ps  
$ sudo docker exec -it 775c7c9ee1e1 /bin/bash
2020/12/7 posted in  Docker

k8s ? k3s

k3s[1]是rancher®开源的一个Kubernetes发行版,从名字上就可以看出k3s相对k8s做了很多裁剪和优化,二进制程序不足50MB,占用资源更少,只需要512MB内存即可运行。

Read more   2020/10/7 posted in  Docker

Docker 的初体验

列出使用的常用命令方便自己查找吧

创建一个容器

docker run -i -t ubuntu /bin/bash

-i 是为了保证容器中的STDIN是始终开启的
-t 表示让Docker为创建的容器创建一个伪tty终端

Read more   2018/10/3 posted in  Docker