Docker学习笔记(二)-使用

Docker学习笔记(二)-使用

三月 18, 2020 阅读量

Docker学习笔记(二)-使用

因为不是运维,只是简单了解一下,有一个概念,所以这里写的很简单

5 Docker数据卷

数据卷(Data Volume)是在宿主中可以在容器之间进行共享和重用的一系列和文件和文件夹,为了持久化和共享数据。当数据卷目录挂载到容器目录后,修改会立即同步。容器和数据卷都可以一对多。

配置数据卷
创建容器时使用-v参数来挂载数据卷,主机目录不写会默认分配一个目录
目录必须是绝对路径,目录不存在会自动创建,可以挂载多个数据卷(多个-v
docker run ... -v 主机目录(文件):容器内目录(文件) ...

1
2
3
4
docker run -it --name=c3 \
-v /root/data:/root/data \
-v /root/data2:/root/data2 \
centos:8

以上数据卷,容器c3,容器c4的目录操作都会同步(共享数据)。删除容器,数据卷的数据还存在(持久化)。
通过docker inspect命令查看容器信息,在HostConfig下的Binds(Mounts里也能)查看绑定数据卷信息。

配置数据卷容器
通过--volume-from参数配置,可以简化数据配置。容器会直接和数据卷关联,删除数据卷容器不影响下面的容器和数据卷的交互。

1
docker run -it --name=cd1 --volumes-from c3 centos:8

6 Docker应用部署

应用部署一般过程为:搜索镜像,拉取镜像,创建容器。这里以mysql来举例,其他的也差不多,只是容器创建的时候有所不同,比如挂载数据卷之类的。

1
2
3
4
5
6
7
8
搜索镜像(版本号需要从Docker Hub上看)
docker search mysql

拉取镜像
docker pull mysql:8

创建容器(设置端口映射)
docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -id mysql:8

-p 3306:3306 将容器的3306端口映射到主机的3306端口
-e MYSQL_ROOT_PASSWORD=123456 初始化root用户的密码

远程连接mysql数据库成功

7 Dockerfile

Docker镜像由一层一层的文件系统(UnionFS联合文件系统)组成,Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
镜像制作可以通过容器转为镜像
容器转镜像(挂载的目录不会写入镜像,root目录下的生效)
docker commit [容器id] [镜像名称]:[镜像版本号]
镜像转压缩文件
docker save -o [压缩文件名称] [镜像名称]:[镜像版本号]
压缩文件解压(还原)
docker load -i [压缩文件名称]

这里用tomcat来举例,简单创建一个tomcat容器。

1
2
3
4
5
6
7
8
docker search tomcat
docker pull tomcat
docker run -id --name mytomcat -p 8080:8080 -v /root/tomcat:/usr/local/tomcat/webapps tomcat
cd /root/tomcat/
mkdir HelloWorld
cd HelloWorld/
vim index.html
写入<h1>Hello World By Docker</h1>

通过url访问

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
容器转镜像
docker commit e3bb40626a58 myimg_tomcat:1.0
进入容器
docker exec -it myimg_tomcat bash
镜像转压缩文件
docker save -o myimg_tomcat.tar myimg_tomcat:1.0
删除原镜像
docker rmi myimg_tomcat:1.0
压缩文件解压(还原)
docker load -i myimg_tomcat.tar
创建新容器
docker run -it --name load_tomcat myimg_tomcat:1.0 bash
容器内查看webapps目录,原来挂载文件消失
cd /usr/local/tomcat/webapps
ls

推荐使用dockerfile来创建自定义镜像
书写可以参考Docker Hub上面的Dockerfile文件的写法或者官方文档,这里简单列一下关键字。
FROM 基于那个image构建(scratch为空镜像)
LABEL 一些标签说明
RUN 执行命令,在docker build时运行
CMD 类似RUN,在docker run时运行,可被 docker run 命令行参数中指定要运行的程序所覆盖
ENTRYPOINT 类似CMD,但其不会被 docker run 的命令行参数指定的指令所覆盖
EXPOSE 声明端口
ENV 设置环境变量
ARG 类似ENV,环境变量仅对 Dockerfile 内有效
COPY 复制文件或者目录到容器里指定路径
ADD 类似COPY,同样功能推荐用COPY,ADD可以自动解压压缩文件到目标路径
VOLUME 定义匿名数据卷
USER 指定执行后续命令的用户和用户组
WORKDIR 指定工作目录
ONBUILD 延迟构建命令的执行
LABEL 标签
MAINTAINER 作者信息
HEALTHCHECK 健康检查
SHELL 指定执行脚本的shell

使用Dockerfile创建镜像
docker build -f [Dockerfile路径] -t [镜像名]

1
2
3
4
5
6
7
8
9
10
11
12
13
这里新建Dockerfile文件来创建镜像
vim tomcat_dockerfile
写入
FROM tomcat:latest
MAINTAINER xuchl<[email protected]>

WORKDIR /usr/local/tomcat/webapps
RUN mkdir HelloWorld
WORKDIR /usr/local/tomcat/webapps/HelloWorld
RUN echo "<h1>Tomcat From Dockerfile</h1>" > index.html

创建镜像
docker build -f ./tomcat_dockerfile -t dcfile_tomcat:1.0 .


用Dockerfile Build镜像时Docker client会默认把Dockerfile同级所有文件发给docker Deamon中导致发送内容过大。

可以新建一个空目录放Dockerfile文件,或者使用.dockerignore文件设置黑名单,该文件包含的目录不会被发送到Docker daemon中。

1
2
创建容器
docker run --name dcc -p 8080:8080 -d dcfile_tomcat:1.0

通过url访问

8 Docker服务编排

Compose是用于定义和运行多容器Docker应用程序的工具,Compose具有用于管理应用程序整个生命周期的命令,包括启动,停止和重建服务等。

步骤
1 使用Dockerfile定义应用环境,以便可以在任何地方复制。
2 使用docker-compose.yml定义组成应用程序服务,以便它们可以在隔离的环境中一起运行。
3 运行 docker-compose up启动并运行整个应用程序。

1
2
3
4
5
6
7
8
安装Docker Compose的当前稳定版本(下了几次失败,换了国内的地址秒好)
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

设置文件可执行权限
sudo chmod +x /usr/local/bin/docker-compose

查看版本信息来验证是否安装成功
docker-compose -v

简单写一个yml启动的例子(进入容器内加的页面),关键字就不(偷)解释(懒)了。

1
2
3
4
5
6
7
8
9
10
11
mkdir composeHelloWorld
cd composeHelloWorld/

vim docker-compose.yml

version: '3'
services:
tomcat:
image: tomcat
ports:
- "8090:8080"

9 Docker私有仓库

私有仓库registry是一个官方提供的镜像。这里仓库放在本机,实际上是要放到不同机器上的。
搭建

1
2
3
4
拉取仓库镜像
docker pull registry
创建容器并启动
docker run -id --name registry -p 5000:5000 registry

访问http://私库ip地址:5000/v2出现{}说明运行正常

上传

1
2
3
4
5
标记镜像
docker tag centos:8 localhost:5000/centos:8

推送镜像
docker push localhost:5000/centos:8


访问http://私库ip地址:5000/v2/_catalog出现{"repositories":["centos"]}说明上传成功

拉取

1
2
拉取镜像
docker pull localhost:5000/centos:8


这里因为是本机,需要先删除才能拉取下来。

Docker官方提供的私有仓库registry虽然简单但在管理上存在不足。可以通过Harbor来弥补以上不足(这里只提一下)。