Study Docker
2020.3.29 – Hao
安装Docker
环境查看
# 使用uname查看系统
┌──(root Arch)-[/]
└─# uname -r
5.11.11-arch1-1
# 查看系统的版本等信息
┌──(root Arch)-[/]
└─# cat /etc/os-release
NAME="Arch Linux"
PRETTY_NAME="Arch Linux"
ID=arch
BUILD_ID=rolling
ANSI_COLOR="38;2;23;147;209"
HOME_URL="https://www.archlinux.org/"
DOCUMENTATION_URL="https://wiki.archlinux.org/"
SUPPORT_URL="https://bbs.archlinux.org/"
BUG_REPORT_URL="https://bugs.archlinux.org/"
LOGO=archlinux
安装

Docker的常用命令
帮助命令
docker version # 显示docker的版本信息
docker info # 显示docker的系统信息,包括docker的镜像和容器的数量
docker 命令 --help # 常用
Docker的官方文档: https://docs.docker.com/

镜像命令
docker images 查看所有本地的主机镜像
┌──(root Arch)-[/home/zhouhao]
└─# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat latest 0ce438e89a29 2 days ago 667MB
nginx latest b8cf2cbeabb9 3 days ago 133MB
# 解释
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的ID
CREATED 镜像的创建时间
SIZE 镜像的大小
# 可选项
Options:
-a, --all #列出所有镜像
Show all images (default hides intermediate images)
-q, --quiet #只显示镜像ID
Only show image IDs
docker search搜索镜像
┌──(root Arch)-[/home/zhouhao]
└─ # docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 10676 [OK]
mariadb MariaDB Server is a high performing open sou… 4010 [OK]
# 可选项, 通过搜索来过滤
--filter=STARS=3000 # 搜索出STARS大于3000的镜像
docker pull 下载镜像
# 下载镜像 docker pull 镜像名:tag (tag为版本号)
# 不指定版本号默认是下载最新版本的镜像
┌──(root Arch)-[/home/zhouhao]
└─# docker pull centos
Using default tag: latest # 如果不写tag 默认是lastest
latest: Pulling from library/centos
7a0437f04f83: Pull complete # 分层下载
Digest: sha256:5528e8b1b1719d34604c87e11dcd1c0a20bedf # 签名
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest # 真实地址
docker pull centos # 等价于 docker pull docker.io/library/centos:latest
# 指定版本下载
容器命令
docker start 容器ID #启动容器
docker attach 容器id #进入容器
删除全部容器: docker rm $(docker ps -aq)
docker image rm -f 镜像ID # 删除对应ID的镜像
需要注意删除镜像和容器的命令不一样。
# docker rmi ID ,其中 容器(rm) 和 镜像(rmi)
其他重要命令
1. 容器保存为镜像
- 我们可以通过以下命令将容器保存为镜像
docker commit ubuntu pwn
# ubuntu是容器名称
# pwn是新的镜像名称
2. 镜像的导出导入
有时我们需要将一台电脑上的镜像复制到另一台电脑上使用,除了可以借助仓库外,还可以直接将镜像保存成一个文件,再拷贝到另一台电脑上导入使用。
-
使用export 和 import命令
# 导出镜像 # 使用docker export 命令根据容器 ID 将镜像导出成一个文件。 docker export f299f501774c > pwn.tar # 导入镜像 # 使用 docker import 命令则可将这个镜像文件导入进来。 docker import pwn < pwn.tar
# 保存镜像
# 下面使用 docker save 命令根据 ID 将镜像保存成一个文件。
docker save 0fdf2b4c26d3 > pwn.tar
(2)我们还可以同时将多个 image 打包成一个文件,比如下面将镜像库中的 tomcat 和 centos 打包:
docker save -o images.tar tomcat:9.6 centos:3.4
# 载入镜像
使用 docker load 命令则可将这个镜像文件载入进来。
docker load < .tar
# 两种方案的差别
特别注意:两种方法不可混用。
如果使用 import 导入 save 产生的文件,虽然导入不提示错误,但是启动容器时会提示失败,会出现类似"docker: Error response from daemon: Container command not found or does not exist"的错误。
# 1,文件大小不同
export 导出的镜像文件体积小于 save 保存的镜像
# 2,是否可以对镜像重命名
docker import 可以为镜像指定新名称
docker load 不能对载入的镜像重命名
# 3,是否可以同时将多个镜像打包到一个文件中
docker export 不支持
docker save 支持
# 4,是否包含镜像历史
export 导出(import 导入)是根据容器拿到的镜像,再导入时会丢失镜像所有的历史记录和元数据信息(即仅保存容器当时的快照状态),所以无法进行回滚操作。
而 save 保存(load 加载)的镜像,没有丢失镜像的历史,可以回滚到之前的层(layer)。
# 5,应用场景不同
docker export 的应用场景:主要用来制作基础镜像,比如我们从一个 ubuntu 镜像启动一个容器,然后安装一些软件和进行一些设置后,使用 docker export 保存为一个基础镜像。然后,把这个镜像分发给其他人使用,比如作为基础的开发环境。
docker save 的应用场景:如果我们的应用是使用 docker-compose.yml 编排的多个镜像组合,但我们要部署的客户服务器并不能连外网。这时就可以使用 docker save 将用到的镜像打个包,然后拷贝到客户服务器上使用 docker load 载入。
容器数据卷
什么是数据卷
如果数据都在容器中,那我们把容器删除,数据就会丢失 需求:数据可以持久化
比如我们有一个MySQL数据库,如果把容器删除了,相当有删库跑路!需求:MySQL数据可以存储在本地!
容器之间可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地!
这就是卷技术!目录挂载,将我们容器内的目录,挂载到Linux上面!
总结一句话: 容器的持久化和同步操作!容器间也是可以数据共享的!
使用数据卷
方式一:直接使用命令挂载 -v
docker run -it -v 主机目录:容器目录
# 测试
[zhouhao@Arch] sudo docker run -it -v /home/Docker:/home ubuntu /bin/bash
# 容器启动后我们可以使用 docker inspect 容器ID -->查看信息
实战:安装MySQL
思考:MySQL数据持久化的问题
# 运行容器,需要做数据挂载
# 安装MySQL,需要配置密码,!!
# 官方测试:
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
# 运行
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置 [MYSQL_ROOT_PASSWORD : 为设置MySQL的密码]
--name 容器名字
# 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=123.com --name mysql_01 mysql
# 测试连接数据库
mysql -h127.0.0.1 -uroot -p123.com -P3310
具名和匿名挂载
#匿名挂载
-v 容器内路径
-P 随机指定端口映射
docker run -d -P --name nginx_01 -v /etc/nginx nginx
docker volume --help #查看关于docker卷的命令
#查看所以volume的情况
docker volume ls
local 4aa455fa5eef0bcba61b28ac8963661f88f35396a8b7ef37bbfa08abfb8a8f88
# 这种就是匿名挂载 我们发现这种挂载我们在-v后面只接了容器内路径,没有写容器外路径
# 具名挂载
┌──(root💔kali)-[~]
└─# docker run -d -P --name pwn -v work-space:/usr/local docker_pwn:18.04
06792438d549dc6145c498170987d445790f2251ff684a6d1068ab441abf0c27
┌──(root💔kali)-[~]
└─# docker volume ls
DRIVER VOLUME NAME
local work-space
# 通过 -v 卷名:容器路径
# docker volume ls 查看卷
┌──(root💔kali)-[~]
└─# docker volume inspect work-space
[
{
"CreatedAt": "2021-05-23T00:51:13-04:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/work-space/_data",
"Name": "work-space",
"Options": null,
"Scope": "local"
}
]

拓展:
# 通过 -v 容器内路径,ro rw 来改变读写权限
ro readonly # 只读
rw readwrite # 可读可写
# 一旦设置了容器权限,容器对我们挂载出来的内容就有限定了!
docker run -d -P --name pwn -v work-space:/usr/local:ro docker_pwn:18.04
docker run -d -P --name pwn -v work-space:/usr/local:rw docker_pwn:18.04
# ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作
初识Dockerfile
Docckerfile 就是用来构建 docker 镜像的构建文件 (命令脚本)
通过这个脚本可以生成镜像,镜像是一层一层的
# 创建一个dockerfile文件, 名字可以随机 建议Dockerfile
# 文件中的内容 指令(大写) 参数
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "----end----"
CMD /bin/bash
# 这里的每一个命令,就是镜像的一层

数据卷容器

快捷键 Ctrl+P+Q --> 不关闭地退出当前容器
# 启动三个容器 (使用刚刚用Dockerfile生成的镜像)
# 启动第一个容器
docker run -it --name docker01 zhouhao/centos:1.0

# 启动第二个容器
docker run -it --name docker02 --volumes-from docker01 zhouhao/centos:1.0
1. 容器保存为镜像
我们可以通过以下命令将容器保存为镜像
docker commit pinyougou_nginx mynginx
1
pinyougou_nginx是容器名称
mynginx是新的镜像名称
Dockerfile
Dockerfile介绍
Dockerfile 用来构建docker镜像的文件! --> 命令参数脚本
构建步骤:
- 编写一个dockerfile文件
- dockerbuild 构建成为一个镜像
- docker run 运行镜像
- docker push 发布 (DockerHub , 阿里云镜像仓库)
官方的做法:

很多官方镜像都是基础包,好多功能和命令都没有.所以我们可以使用 DockerFile 来自己搭建自己的镜像
Dockerfile的搭建过程
基础知识:
- 每个保留关键字(指令)都必须是大写字母
- 执行从上到下执行
- # 号表示注释
- 每一个指令都会创建提交一个新的镜像层,并提交.

DockerFile是面向开发的,我们以后要发布项目,做镜像都需要编写dockerfile文件,这个文件十分简单!
Docker 镜像逐渐成为企业交付的标准,必须要掌握!
步骤:开发,部署,运维…缺一不可
-
DockerFile:构建文件,定义了一切的步骤,源代码
-
DockerImage:通过DockerFile 构建生成的镜像,最终发布和运行的产品,原来是jar war
-
Docker容器:容器就是镜像运行起来提供服务的.
Dockerfile的指令
FROM # 基础镜像,一切从这里开始构建
MAINTAINER # 镜像是谁写的,姓名+邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 步骤:tomcat镜像,这个tomcat压缩包!添加内容
WORKDIR # 镜像的工作目录
VOLUME # 挂载目录
EXPOSE # 保留端口配置
CMD # 指定这个容器启动的时候要运行的命令 ,只有最后一个会生效,可被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD # 当构建一个被继承 DockerFile 这个时候就会运行 ONBUILD 的指令,出发指令。
COPY # 类似ADD,将我们的文件拷贝到镜像中。但是COPY不会自动解压
ENV # 构建的时候设置环境变量
实战测试
Docker Hub 中 99%镜像都是从这个基础镜像过来的 FROM scratch

创建一个自己的 Centos
# 1. 编写Dockerfile的文件
FROM centos
MAINTAINER zhouhao<zhouhaobusy@163.com>
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 镜像名:[tag]
425

被折叠的 条评论
为什么被折叠?



