深入浅出Docker应用(阿里云实验)
  oIa1edJoFmXP 2023年11月14日 20 0

(Docker安装和配置)

一、docker安装

yum install -y yum-utils device-mapper-persistent-data lvm2
yum install -y jq

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 

yum install docker-ce.x86_64
yum install -y docker-ce.x86_64 3:20.10.16-3.el7 
yum install -y docker-ce.x86_64 3:24.0.6-1.el7

systemctl start docker.service

二、Docker的配置

镜像源的配置

vi /etc/docker/daemon.json 
https://m19q4y6a.mirror.aliyuncs.com
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://m19q4y6a.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
[root@iZuf682ha96fpea6827qjzZ ~]# systemctl restart docker.service 
[root@iZuf682ha96fpea6827qjzZ ~]# 
[root@iZuf682ha96fpea6827qjzZ ~]# 
[root@iZuf682ha96fpea6827qjzZ ~]# systemctl daemon-reload
[root@iZuf682ha96fpea6827qjzZ ~]# 
[root@iZuf682ha96fpea6827qjzZ ~]# systemctl enable docker.service
[root@iZuf682ha96fpea6827qjzZ ~]# docker version
Client: Docker Engine - Community
 Version:           24.0.6
 API version:       1.43
 Go version:        go1.20.7
 Git commit:        ed223bc
 Built:             Mon Sep  4 12:35:25 2023
 OS/Arch:           linux/amd64
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          24.0.6
  API version:      1.43 (minimum version 1.12)
  Go version:       go1.20.7
  Git commit:       1a79695
  Built:            Mon Sep  4 12:34:28 2023
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.24
  GitCommit:        61f9fd88f79f081d64d6fa3bb1a0dc71ec870523
 runc:
  Version:          1.1.9
  GitCommit:        v1.1.9-0-gccaecfc
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0
[root@iZuf682ha96fpea6827qjzZ ~]#

三、Docker的快速上手

1.启动hello-world

docker run hello-world

2.启动长期运行的bash容器

docker run -it bash

四、容器的查找和下载

1.远程查找容器

docker search ubuntu

2.查找容器的版本信息

docker pull ubuntu
docker pull ubuntu:jammy



(容器的启动和操作)

一、容器的分步骤启动流程

1.创建ubuntu容器

docker create -it ubuntu
docker ps -a

2.创建指定名称的容器

docker create -it --name ubuntu-1 ubuntu
docker ps -a

3.启动ubuntu容器

docker start ubuntu-1
docker ps -a

二、容器的快速启动方式

1.创建容器指定名称的容器

docker run -itd --name ubuntu-2 ubuntu
docker ps -a

2.操作已经创建的容器

docker exec -it ubuntu-2 bin/bash

3.创建一次性容器

docker run -it --name temp ubuntu
exit
docker ps -a

三、为容器安装命令行工具

1.启动容器并测试常用命令

docker run -it --name ubuntu-3 ubuntu
lsb_release

2.在容器中安装命令

apt-get update
apt-get install -y lsb-core net-tools vim --fix-missing

3.busybox镜像的使用

docker run -itd --name busybox-1 busybox
docker exec -it busybox-1 sh

四、查看容器系统信息

1.查看宿主机信息

lsb_release -a
ifconfig



(容器管理命令)

docker run -itd --name ubuntu-3 ubuntu
docker exec -it ubuntu-3 /bin/bash

docker images
docker ps -a 

容器的停止
docker top ubuntu-3
docker stop ubuntu-3
docker ps -a 
容器的重启
docker restart ubuntu-3
docker top ubuntu-3
容器的删除
docker ps -a
docker rm --force [CONTAINER ID]
或
docker rm --force ubuntu-3
docker ps -a



(容器镜像管理命令)

一、镜像的下载,显示和删除

1.镜像的下载

docker pull debian
docker images

2.镜像的查看

docker inspect debian

3.镜像的删除

当镜像下载之后,我们可以通过docker rmi命令进行删除。

docker run -itd --name debian-3 debian
docker rm -f debian-3
docker images

要注意的是docker rmi无法删除已经创建了容器的镜像,如果需要删除需要先停止相关的容器,并添加--force参数。

docker rmi --force debian
docker images

二、镜像的保存和加载

1.镜像的本地保存

首先我们可以通过docker save命令可以将docker内部的一个或多个镜像导出成文件。

下面的命令中我们先下载nginx,hello-world两个镜像,然后再将镜像导出到images.tar文件中。

docker save的格式为:docker save -o [导出文件名] [需要导出的镜像列表]...

docker pull hello-world
docker pull nginx
docker save -o images.tar nginx hello-world  
ll images.tar

2.删除已有镜像

上一步已经将nginx,hello-world两个镜像保存到文件images.tar。

接下面我们将现有的两个镜像从docker内部删除。为后面的镜像读取做准备。

docker rmi hello-world
docker rmi nginx
docker images

3.从本地加载镜像文件

接下来我们通过docker load命令将images.tar中的两个镜像导入回docker内部。

即可实现在没有网络访问的情况更新镜像。

docker load的格式为:docker load -i [导入文件名]。

在镜像导入完毕之后,我们可以通过docker image进行验证。

docker load -i images.tar
docker images

三、容器快照的导出和导入

通过docker save和 docker load的方法实现docker内部的镜像保存和加载。

1.创建实验容器

首先我们创建一个容器ubuntu-3,然后在ubuntu-3创建一个文本文件。

此处我们可以使用docker exec bash -c "命令行"方式直接在宿主机执行命令。

我们通过echo命令在容器中创建名为snapshot.txt的文件。

在创建之后再使用cat命令验证容器中的文件。

docker run -itd --name python-1 python
docker exec python-1 bash -c "echo snapshot > snapshot.txt"
docker exec python-1 bash -c "cat snapshot.txt"

2.容器快照的导出

当容器文件修改之后,我们可以通过docker export命令将容器以快照的形式导出到文件。

其命令的格式为docker export 容器名 > 快照文件名。

和镜像导出不同,快照的导出,会将容器的镜像,和容器在镜像之上的修改部分同时导出。

docker export python-1 > python-snapshot.tar
ll python-snapshot.tar

3.容器快照的导入

对于通过docker export导出的容器快照文件。

我们可以通过docker import命令将其导入到docker中,

在这里需要特别注意的是:docker import是以镜像而不是容器的形式导入快照。

也就是说导入的快照并不能直接运行,而是需要根据此快照镜像再次创建容器才可以使用。

docker import命令的格式为docker import 快照文件 导入镜像名称:版本号

docker import python-snapshot.tar python-snapshot:latest

快照导入后,我们可以利用导入的快照镜像创造一个新的容器。并验证通过快照创建的容器中包含着之前容器中创建的文件。

docker run -itd --name snapshot python-snapshot /bin/bash
docker exec snapshot cat snapshot.txt

四、镜像的内部层次关系

1.inspect过滤器的使用

docker inspect -f "模板字符串" 镜像名

docker pull python
docker inspect -f "{\"Id\":{{json .Id}},\"RepoTags\":{{json .RepoTags}}}" python | jq

2.镜像的层次关系

docker inspect -f "{{json .RootFS.Layers}}" python | jq

3.普通镜像和快照镜像的区别

docker inspect -f "{{json .RootFS.Layers}}"  python-snapshot | jq
docker images | grep python-snapshot
ls -ll | grep python-snapshot.tar



(容器镜像的制作1)

一、通过容器生成镜像

1.环境准备

docker run -itd --name ubuntu-commit ubuntu
docker inspect -f "{{json .RootFS.Layers}}"  ubuntu | jq

2.查看容器修改内容

docker diff 容器名

docker exec ubuntu-commit apt-get update
docker diff ubuntu-commit

3.生成新的镜像

docker commit ubuntu-commit ub/commit
docker images

4.查看新镜像的层

docker inspect -f "{{json .RootFS.Layers}}"  ub/commit | jq

二、部署私人镜像仓库

1.部署私人镜像仓库

我们使用--network=host参数,指定容器在启动时使用Host网络模型。

docker run -d  --network=host --name registry-1 registry

2.验证网络服务

netstat -tunple | grep 5000
curl 127.0.0.1:5000/v2/_catalog

三、向私有仓库中推送镜像

如何将本地docker中的镜像推送到私有仓库中。

1.为镜像设置仓库信息

默认的docker push命令会将容器推送到docker公共仓库,为了能将镜像推送到私人仓库,

我们要使用docker tag命令为镜像设置需要推送的仓库信息。

其命令的参数为docker tag [本地镜像名] [私有仓库的URL][私有仓库的镜像名称]。

标记镜像之后,我们使用docker images命令查看会发现,

为本地镜像设置tag之后,会在本地镜像列表中生成一个新的镜像。

docker tag ub/commit 127.0.0.1:5000/ub/commit
docker images

2.向仓库推送镜像

docker push 127.0.0.1:5000/ub/commit:latest

3.通过私有仓库API验证推送

curl 127.0.0.1:5000/v2/_catalog
curl 127.0.0.1:5000/v2/ub/commit/tags/list

四、从私有仓库中拉取镜像

1.删除本地镜像

docker rmi ub/commit  
docker rmi 127.0.0.1:5000/ub/commit

2.从私有仓库中拉取镜像

docker pull 127.0.0.1:5000/ub/commit
docker images

3.查看本地镜像信息

docker inspect -f \
"{\"RepoTags\":{{json .RepoTags}}, \"RepoDigests\":{{json .RepoDigests}}}" 127.0.0.1:5000/ub/commit | jq



(容器镜像的制作2)

一、docker build快速上手

1.制作Dockerfile文件

vi Dockerfile
FROM ubuntu:latest
RUN apt-get update

2.制作容器镜像

Dockerfile文件编写完毕后,我们就就可以根据该文件,使用docker build命令来制作容器镜像,

该命令的格式为docker build -t 容器镜像名 Dockerfile所在路径。

命令的第三个参数用于指定Dockerfile文明的位置,如果Dockerfile文件就在控制台的当前目录下,一般使用.来设置。

docker build -t ub/build .
docker images

3.Dockerfile命令列表

Dockerfile文件的格式于脚本文件,每一行是一条命令,每行的格式为命令 参数。

Dockerfile主要支持的命令如下表,因篇幅的原因,

本实验中我们无法具体演示每一条指令的用法,只会讲解一些重要的命令,。

FROM

指定基础镜像,必须为第一个命令

LABEL

为镜像添加标签

RUN

构建时执行的命令行指令

ADD

将本地文件添加到容器中,如果为tar类型文件,则会自动解压,可以访问网络资源,类似wget(网络资源不会被解压)

COPY

将本地文件添加到容器中,不会解压,也不可以访问网络资源

CMD

容器启动时执行的命令,只有最后一条可以生效,可以被docker run的启动命令覆盖。

ENTRYPOINT

容器启动时执行的入口,只有最后一条可以生效,一定会被执行,不可以被覆盖。

EXPOSE

设置默认开放的网络端口(后面的实验会涉及到)

VOLUME

设置默认加载的VOLUME卷(后面的实验会涉及到)

ENV

设置环境变量。

WORKDIR

设置默认的工作目录。

USER

设置容器运行时的用户。

ONBUILD

构建触发器,当此镜像被其他镜像用作基础镜像时,触发器会被执行。

ARG

设置构建参数,可以通过docker build --build-arg将参数从外部传到到Dockerfile构建过程中。

二、Dockerfile命令详解1

Dockerfile文件中的常用的FROM,RUN,WORKDIR,ADD四个命令命令。

1.命令讲解和环境准备

mkdir dir6-1
cd dir6-1
echo 本地文件 > info.txt
echo 压缩文件 > tar.txt
tar zcvf info.tar.gz tar.txt

2.构建容器镜像

vi Dockerfile

FROM ubuntu:latest
WORKDIR data
RUN echo 容器中生成的文件 > img.txt
ADD info.txt info.txt
ADD info.tar.gz .
WORKDIR dir-robots
ADD https://www.aliyun.com/robots.txt robots.txt

然后使用docker build编译容器镜像

docker build -t img6-1 .

3.验证容器镜像

docker run -itd --name container6-1 img6-1
docker exec container6-1 pwd
docker exec container6-1 cat robots.txt

我们继续验证其他目录的文件。

这里我们使用了docker exec container6-1 ls和docker exec container6-1 cat命令。

docker exec container6-1 ls ..
docker exec container6-1 cat ../img.txt
docker exec container6-1 cat ../info.txt
docker exec container6-1 cat ../tar.txt

三、Dockerfile命令详解2

我们再来看另外的三个Dockerfile命令,分别是ENV,CMD,ENTRYPOINT。

1.ENV和CMD命令讲解

Dockfile中的ENV命令的功能相对比较简单。通过该命令我们可以为容器镜像设置环境变量。通过环境变量我们可以将一些配置信息固化在镜像中。

接下来再来看CMD命令,这个命令用来设置容器的初始化命令。

通过此命令我们可以让容器在启动时候执行一条命令,通过这条命令我们可以实现容器启动后,运行一个服务,或者在控制台输出一段文字等功能。

此命令的格式为CMD [”参数1“, ”参数2“...]。

在使用CMD命令是我们需要注意的几点是:

a. 这条命令虽然可以设置很多次,但是之后最后一次会生效。

b. 当我们使用docker run命令启动容器时,我们可以docker run 容器镜像名后面加入参数1 参数2..的形式 代替容器镜像中原有的CMD命令。

我们创建子目录,并使用vi修改Dockerfile为如下内容。并编辑为如下内容。

cd  
mkdir dir6-2

vi dir6-2/Dockerfile

FROM ubuntu:latest
ENV IMG_STRING img6-2的环境变量
CMD ["echo", "$IMG_STRING"]

Dockerfile编写完毕后,使用docker build进行编译。

docker build -t img6-2 dir6-2

2.CMD和ENTRYPOINT命令讲解

除了CMD命令之外我们还可以使用ENTRYPOINT命令来实现类似的功能。

该命令和CMD命令的格式和功能基本一致,其区别在于docker run命令只能使用--entrypoint参数替换镜像中的ENTRYPOINT设置。

在编写Dockerfile时,如果ENTRYPOINT和CMD命令同时出现的时候,容器启动时会将两个指令的参数串联起来,以ENTRYPOINT参数1, ENTRYPOINT参数2..., CMD参数1, CMD参数2...的形式执行启动命令。

因此在具体使用时,我们一般在ENTRYPOINT中设置初始化命令,在CMD中设置初始化命令的参数。需要注意的是,ENTRYPOINT和CMD命令联合使用的时候,只能使用[”参数1“, ”参数2“...]格式的参数。

我们创建子目录,并使用vi修改Dockerfile为如下内容。并编辑为如下内容。

cd  
mkdir dir6-3

vi dir6-3/Dockerfile

FROM ubuntu:latest
CMD ["-c", "echo CMD作为ENTRYPOINT的参数"]
ENTRYPOINT ["bash"]

Dockerfile编写完毕后,然后使用docker build编译容器镜像

docker build -t img6-3 dir6-3

3.验证容器镜像

docker run img6-2
docker run img6-2 ls -ll
docker run img6-3
docker run --entrypoint echo img6-3 "手动设置ENTRYPOINT和CMD"
docker run img6-3 -c "echo 手动设置CMD参数"

四、容器镜像的层次关系

1.查看镜像层次

docker inspect -f "{{json .RootFS.Layers}}" img6-1 | jq

2.查看镜像历史

docker history img6-1

3.镜像层次和镜像历史之间的关系

docker history img6-2
docker inspect -f "{{json .RootFS.Layers}}" img6-2 | jq
docker history img6-3
docker inspect -f "{{json .RootFS.Layers}}" img6-3 | jq
docker inspect -f "{{json .RootFS.Layers}}" ubuntu | jq



(容器的配置和存储)

一、配置和存储的快速上手

1.容器环境变量

docker run -it --name env1 -e ECHO=环境变量 -e NUM=123456 busybox
echo $ECHO $NUM
exit

2.容器文件复制

容器中的另一个存储方式是使用docker cp命令,在宿主机和容器之间进行文件的复制。

在文件复制时容器中文件的描述方式为,容器名:容器文件路径。

echo 本机生成的文件 > local.txt
docker run -itd --name file1 busybox
docker cp local.txt file1:/local.txt
docker exec file1 cat local.txt

3.文件的挂载

可以在创建容器的时候使用-v参数将宿主机中的文件直接挂在到容器中。

该参数的用法为-v 宿主机文件的绝对路径:容器文件的绝对路径。

二、MYSQL镜像的基本用法

1.MySQL容器的启动配置

docker pull mysql:8.0
docker run -itd --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=[MYSQL密码] mysql:8.0
docker exec -it mysql bin/bash
docker stop mysql
docker rm b1749fe24b7d
docker run -itd --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root__ mysql:8.0
docker exec -it mysql bin/bash
echo $MYSQL_ROOT_PASSWORD
exit
docker exec -it mysql mysql -uroot -p
[输入MYSQL密码]

可执行mysql命令查找状态

status
show Databases;
help
exit

三、复制修改MYSQL配置文件

docker cp将配置文件复制到宿主机中的/root/mysql/config/目录中作为副本

mkdir -p /root/mysql/config/
docker cp mysql:/etc/my.cnf /root/mysql/config/my.cnf
cat /root/mysql/config/my.cnf

四、挂载MYSQL配置文件

1.应用配置文件

我们将配置文件复制回容器中,为了让配置文件生效,我们需要使用docker restart命令重新启动容器。

docker cp /root/mysql/config/my.cnf mysql:/etc/my.cnf
docker restart mysql

2.查看配置结果

docker exec -it mysql mysql -uroot -p
[MYSQL密码]
show variables like 'general_log';
exit

3.挂载方式应用配置文件

docker run -itd --name mysql-mount -e MYSQL_ROOT_PASSWORD=[MYSQL密码] -v /root/mysql/config/my.cnf:/etc/my.cnf mysql:8.0
docker exec -it mysql-mount mysql -uroot -p
[MYSQL密码]
show variables like 'general_log';
exit

docker run -itd --name mysql-mount -e MYSQL_ROOT_PASSWORD=root__ -v /root/mysql/config/my.cnf:/etc/my.cnf mysql:8.0
docker exec -it mysql-mount mysql -uroot -p  
show variables like 'general_log';
exit



(容器的文件系统挂载)

一、容器的共享挂载

1.我们先创建一个本地文件share.txt,然后让容器挂载这个文件。

echo '宿主机初始化文件' > share.txt

docker run -itd --name share1 -v $(pwd)/share.txt:/share.txt busybox

docker exec share1 cat /share.txt

2.修改本地文件然后查看

echo '从宿主机中修改文件' >> share.txt

docker exec share1 cat /share.txt

3.容器中修改文件

docker exec share1 sh -c "echo '从容器中修改文件' >> /share.txt"

cat share.txt

二、挂载的权限配置

1.容器挂载的权限

如果用户希望控制文件在容器中是否可以被修改,那么可以用rw或者readwrite参数将挂载文件设置为读写权限,或者使用ro或者readonly参数设置为只读权限。

如果文件被设置为的文件,那么只有在宿主机侧才可以进行修改。

docker rm -f $(docker ps -aq)

echo '宿主机初始化文件' > share.txt

docker run -itd --name share-readonly -v $(pwd)/share.txt:/share.txt:ro busybox

docker exec share-readonly cat /share.txt

2.验证只读权限

echo '从宿主机中修改文件' >> share.txt

docker exec share-readonly cat /share.txt

docker exec share-readonly sh -c "echo '从只读容器中修改文件' >> /share.txt"

cat share.txt

3.多个容器同时挂载一个文件

echo '宿主机初始化文件' > share.txt

docker run -itd --name share-readwrite -v $(pwd)/share.txt:/share.txt:rw busybox

docker exec share-readonly sh -c "echo '从只读容器中修改文件' >> /share.txt"

docker exec share-readwrite sh -c "echo '从读写容器中修改文件' >> /share.txt"

cat share.txt

三、文件夹的挂载

1.准备

mkdir mount

echo '宿主机中的文件' > mount/host

vi Dockerfile  
FROM busybox:latest

RUN mkdir mount

RUN echo '容器中的文件' > /mount/image

2.挂载文件夹

docker build -t folder .

docker run -itd --name folder1 -v $(pwd)/mount:/mount folder

3.验证挂载文件夹

docker exec folder1 ls /mount

docker exec folder1 cat /mount/host

四、Apache挂载案例

1.准备

首先我们在宿主机中创建一个文件夹webfile,然后通过echo >命令在文件夹中生成一个简单的纯文本网页index.html。

mkdir webfile

echo '默认网页' > ./webfile/index.html

2.挂载网页文件夹

然后我们在启动服务时,通过-v参数将宿主机中的文件夹,覆盖挂载到Apache容器的/usr/local/apache2/htdocs目录上;并且通过端口映射将容器中的服务发布到宿主机的8000端口上。

容器启动成功之后,我们通过curl命令访问127.0.0.1:8000验证容器服务。

docker run -itd --name file_server1 -p 8000:80 -v /root/webfile:/usr/local/apache2/htdocs httpd

curl 127.0.0.1:8000

3.动态修改网页

当容器启动后,我们在宿主机中修改/webfile/index.html文件,同时创建一个新文件/webfile/host.html,然后通过curl命令验证,发现宿主机中的修改,对容器中的Apache服务已经生效。

echo '修改默认网页' >> ./webfile/index.html

echo '添加Host页面' > ./webfile/host.html

curl 127.0.0.1:8000

curl 127.0.0.1:8000/host.html



(容器中的volume卷)

一、Volume挂载简介

如何在容器中挂载文件和文件夹,这种采用绝对路径,直接挂载宿主机中的文件或者文件夹的方法又叫bind mount。这种方式比较适合将宿主机中的文件共享到容器中的场景。

除此之外docker还提供了另一种volume的方式进行挂载。这种方式通常会先在宿主机中通过docker volume命令创建一个具有名称的volume,然后再将这个volume挂载到容器中。

1.创建volume

在使用volume之间,通常需要先通过docker volume create命令创建volume。

该命令的格式为docker volume create [volume名],和bind mount方式不同的是,volume创建之后默认并没有内容。这里我们创建名为file-vol的volume

docker volume create file-vol

2.挂载volume

在volume创建好之后,我们就可以通过docker run 的-v参数进行挂载。在使用-v参数挂载volume时,用volume名称代替宿主机路径即可。

这里我们创建并启动一个busyboxy容器,并将file-vol挂载到/file目录。

在容器创建之后,我们向volume挂载的文件夹中写入一个文件/file/text。验证挂载成功。

docker run -itd --name vol1 -v file-vol:/file busybox

docker exec vol1 sh -c "echo '向volume中写入文件' > /file/text"

docker exec vol1 ls /file

docker exec vol1 cat /file/text

3.查看volume信息

当我们在容器的挂载点中保存数据之后,数据文件会被写入到volume中,这时我们可以通过docker volume inspect或者docker inspect来查看volume的信息。

docker volume inspect file-vol

二、Volume的持久化

1.删除容器

docker stop vol1

docker rm -f vol1

docker volume inspect file-vol

2.重用volume

然后我们再创建一个新的容器vol2,并将file-vol挂载到另一个目录/file-other上。

由于之前的容器把数据存储在了volume中,因此新容器中的/file-other目录中保存vol1容器中的数据

docker run -itd --name vol2 -v file-vol:/file-other busybox

docker exec vol2 ls /file-other

docker exec vol2 cat /file-other/text

3.volume的多重绑定

如同容器可以使用多个端口绑定,容器在启动时也可以使用多个-v参数绑定多个volume,同时一个volume也可以同时绑定到多个容器中。

在容器绑定volume之后,我们还可以通过docker inspect命令通过容器筛选Mounts字段查看volume的信息

docker volume create ext-vol

docker run -itd --name vol3 -v ext-vol:/ext -v file-vol:/file busybox  
docker inspect -f "{{json .Mounts}}" vol3 | jq

三、Volume的常用命令

1.查看整体磁盘占用

在docker中,占用磁盘的对象包括容器镜像,容器,volume等,我们还可以通过docker system df -v命令可以查看所有对象的的磁盘占用。

如果docker的镜像,容器,或者volume对象较多,则可以使用-f参数添加过滤器来筛选具体某一个volume的信息。

下面的命令可以筛选出名为file-vol的volume的过滤器的信息。

docker system df -v

docker system df -v --format=\
'{{range .Volumes}}{{if eq .Name "file-vol"}}\
{{.Name}} - {{.Size}}\n{{end}}{{end}}'

2.自动创建volume

我们使用docker run 创建容器并使用-v挂载volume的时候,如果需要加载的volume还没有被创建,则docker run会自动创建volume。

docker run -itd --name vol4 -v auto-vol:/auto busybox  
docker inspect auto-vol

3.volume的自动删除

ocker也提供了删除所有当前没有被挂载的volume的指令docker volume prune,需要注意的是使用此指令时需要小心,防止数据被误删除!

docker rm -f $(docker ps -aq)  
docker volume prune -a

docker volume ls

四、在MySQL中使用Volume

1.volume的自动创建

docker run -itd --name mysql1 -v db-vol:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=[MYSQL密码] mysql

docker exec -it mysql1 mysql -uroot -p
[MYSQL密码]

docker run -itd --name mysql1 -v db-vol:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root__ mysql
docker exec -it mysql1 mysql -uroot -p

2.操作数据库

CREATE DATABASE ali_db;
USE ali_db;
CREATE TABLE ali_tab (`name` VARCHAR(100));
INSERT INTO ali_tab VALUES('aliyun');
SELECT * FROM ali_tab;
exit

3.重用MySQL数据库

接下来我们删除mysql1容器,删除之后在创建另一个名为mysql2的mysql容器。

mysql2容器创建成功后进入mysql控制台,在控制台中通过USE命令选择数据库,然后用SELECT命令查看数据记录。会发现数据库中记录仍存存在。

docker rm -f mysql1

docker run -itd --name mysql2 -v db-vol:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root__ mysql

docker exec -it mysql2 mysql -uroot -p
[MYSQL密码]

查看数据

USE ali_db;
SELECT * FROM ali_tab;
exit


 

(Docker Compose入门)

一、Docker Compose的安装

1.插件安装(推荐)

yum install -y docker-compose-plugin

docker compose version

2.单独应用安装

curl -SL https://github.com/docker/compose/releases/download/v2.5.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose

docker-compose version

二、YML到JSON的转化工具

YML文件是一种适合人类阅读的配置文件格式,这种文件格式能够表示的数据结构和JSON格式配置文件类似。

为了便于我们学习,我们先来制作一个YML和JSON的互相转换工具,以便于理解YML的格式。

1.创建转换镜像

vi Dockerfile
FROM python:latest

RUN pip install pyyaml

RUN echo "import yaml, json, sys\n\

print(json.dumps(yaml.safe_load(sys.stdin.read()), indent=4))" > 2json.py

RUN echo "import yaml, json, sys\n\

print(yaml.safe_dump(json.load(sys.stdin), sort_keys=False))" > 2yml.py
docker build -t yml/py .  
docker images

2.YML转化为JSON

echo id: '10' > demo.yml

docker run -i --rm yml/py python 2json.py < demo.yml

3.JSON转化为YML

echo \{\"name\":\"aliyun\",\"age\":100} > demo.json

docker run -i --rm yml/py python 2yml.py < demo.json

三、YML格式配置文件

vi demo1.yml
name: "aliyun"

attr:  
    age: 10

    addr: "HANGZHOU"
cat demo1.yml

docker run -i --rm yml/py python 2json.py < demo1.yml
vi demo2.yml
string: "aliyun"
number1: 10
number2: 10.01
boolean: true
# datatime: 2000-01-01 23:59:59
cat demo2.yml

docker run -i --rm yml/py python 2json.py < demo2.yml
vi demo3.yml
scores:  
    - 100
    - 90.5
    - 78
cat demo3.yml

docker run -i --rm yml/py python 2json.py < demo3.yml

四、Docker Compose快速上手

vi docker-compose.yml
version: "3.9"
services:
    busy:
        container_name: busy1
        image: "busybox:latest"
        stdin_open: true
        tty: true
docker compose up -d

docker ps



(Docker Compose部署案例)

version: "3.9"
services:
    web:
       container_name: web
       image: "httpd:latest"
       ports:
          - "5000:80"
          - "6000:8000"
    db:
       container_name: db
       image: "mysql"
       volumes:
          - "mysql-vol:/var/lib/mysql"
       environment:
          MYSQL_ROOT_PASSWORD: "[MYSQL密码]"
volumes:
    mysql-vol: {}

配置文件编写完毕后,我们通过docker compose来启动容器。

docker compose up -d

2.类Docker命令

docker compose exec db ls

docker compose cp docker-compose.yml db:/root/

docker compose exec db bin/bash -c "cat /root/docker-compose.yml"

3.容器的启停删除

docker compose pause

docker compose unpause

docker compose stop

docker compose restart

docker compose down

二、部署WordPress论坛

1.定义MySQL配置

vi db.yml
version: "3"
services:
  db:
    image: mysql:8.0
    command:
      - "--character-set-server=utf8mb4"
      - "--collation-server=utf8mb4_unicode_ci"
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: [MySQL root账号密码]
      MYSQL_DATABASE: wordpress
volumes:
  db_data:

2.定义Redis配置

vi cache.yml
version: "3"
services:
  cache:
     depends_on:
       - db
     image: redis
     network_mode: "service:db"
     restart: always

3.定义WordPress配置

vi app.yml
version: "3"
services:
  db:
    ports:
      - "8000:80"
    environment:
      MYSQL_ROOT_PASSWORD: &wp_passwd [MySQL wordpress账号密码]
  app:
    depends_on:
      - db
      - cache
    image: wordpress:6.0
    network_mode: "service:db"
    restart: always
    environment:
      WORDPRESS_DB_HOST: 127.0.0.1
      WORDPRESS_DB_USER: root
      WORDPRESS_DB_PASSWORD: *wp_passwd

4.启动容器

docker compose -f db.yml -f cache.yml -f app.yml -p wp up -d



(YML配置文件的常用属性)

一、YML配置文件简介

1.环境准备

yum install -y docker-compose-plugin
vi docker-compose.yml
version: "3.9"
services:
    web:
       container_name: web
       image: "httpd:latest"
       ports:
          - "5000:80"
          - "6000:8000"
    db:
       container_name: db
       image: "mysql"
       volumes:
          - "mysql-vol:/var/lib/mysql"
       environment:
          MYSQL_ROOT_PASSWORD: "[MYSQL密码]"
volumes:
    mysql-vol: {}
docker compose up -d

2.配置文件基本讲解

在通过docker compose up启动容器之后,我们来看一下docker_comose.yml的配置文件结构。

在docker_compose中,一个project可以包含多个配置文件中的内容,

如果没有设置所有的资源都会创建在root这个project中,

在project中serviecs字段中的每一个key表示一个serviec,

每个service下又可以由一个或多个container,在service中的基本配置选项如下表。

container_name

等同于--name

image

容器镜像

volumes

等价于-v,类型为数组

ports

等价于-p,类型为数组

environment

等价于ie,类型为对象

需要注意的是,默认情况下docker compose会为每个project自动创建一个network,接下来创建的所有的容器都会连接到这个network,我们来验证容器的配置。

docker network ls

docker port web

docker inspect -f "{{json .Mounts}}"  db | jq

3.容器状态查询

我们演示docker compose ps,docker compose top,docker compose images三个命令

docker compose ps

docker compose top

docker compose images

docker compose down

二、YML的常用配置项目

在上一个小节中我们演示了docker compose的主要配置和常用命令,

接下来我们再来看一下docker compose配置文件中的其他配置项目。

yml中的一部分配置选项可以和docker run中的命令行对应,这些属性主要包括在下表中,在本小节中我们来实验这些属性。

stdin_open

设置为true等价于-i参数

tty

设置为true等价于-t参数

networ_mode

网络模式

networks

容器连接的网络,类型为数组

1.编写配置文件

在docker compose中默认使用docker-compose.yml配置文件,  

如果我们想使用不同名称的配置文件,可以在docker compose后面添加-f参数指定yml文件。

我们使用vi创建一个web.yml文件以演示配置选项。

创建之后,我们启动project,在启动时我们可以通过-p参数指定资源所在的Project,以避免资源橙色图,这里我们指定project为web。

vi web.yml
version: "3.9"
services:
    busybox:
        container_name: sh
        image: "busybox:latest"
        tty: true
        stdin_open: true
        networks:
            - "custom"
    python:
        container_name: web
        image: "python"
        network_mode: "host"
        command: "python -m http.server 8000"
networks:
    custom:
        name: "custom"
docker compose -f web.yml -p web up -d

2.创建Project并验证

docker inspect -f '{"Tty":{{.Config.Tty}},"OpenStdin":{{.Config.OpenStdin}}}' sh | jq

docker inspect -f "{{json .NetworkSettings.Networks}}" sh | jq

3.查看配置信息

docker compose -f web.yml -p web convert busybox

docker compose -f web.yml -p web convert python

三、YML的其他配置项目

在本小节中我们再来看三个并不是和docker run 命令参数有对应关系的docker compose属性值的用法。

deploy.replicas

可以选择Service中容器的部署个数。

depends_on

可以选择Service启动的先后顺序

restart

设置Service的重启策略

1.容器个数

deploy:
            replicas: 3

2.启动顺序

depends_on:
            - "busybox-before"
            - "busybox"

3.重启策略

restart: "always"

因此在生产环境中,我们一般会配置使用restart属性。该属性可以根据值得不同设定容器得自动重启策略。

常用得属性值包括:no不自动重启,always总是自动重启,on-failure错误退出时重启。

四、Flask的build联动案例

1.环境准备

mkdir app

vi app/main.py
# 导入Flask类
from flask import Flask  
# 创建app对象
app = Flask(__name__)

# 将对路径"/"得访问路由到函数index上
@app.route('/')
def index():
    return '网页首页\n'

# 将对路径"/Host"得访问路由到函数index上
@app.route('/host')

def host():
    return '访问Host路径\n'

# 启动app对象中得服务,并指导服务端口为8000
if __name__ == '__main__':
    app.run(host="0.0.0.0", port=8000)
vi app/Dockerfile
FROM python
RUN pip install Flask
ADD main.py /app/main.py
WORKDIR /app/
CMD python main.py
vi build.yml
version: "3.9"
services:
    app:
        build: app/
#       build:  
#           context: app/
#           dockerfile: Dockerfile
        ports:  
            - "8080:8000"
        restart: "always"
docker compose -f build.yml -p build up -d

docker compose -f build.yml -p build ps

curl 127.0.0.1:8080

curl 127.0.0.1:8080/host


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月14日 0

暂无评论

推荐阅读
  wwLZeziuqjLR   2023年12月11日   14   0   0 Dockercentos
  MCWYWqSAMsot   2023年12月11日   16   0   0 Docker
  DnoStTHsc0vp   2023年12月11日   12   0   0 Docker
  wwLZeziuqjLR   2023年12月08日   64   0   0 Dockercentosbash
  wwLZeziuqjLR   2023年12月07日   15   0   0 Dockercentos
oIa1edJoFmXP