首页 > 其他分享 >深入浅出Docker应用(阿里云实验)

深入浅出Docker应用(阿里云实验)

时间:2023-10-30 23:32:43浏览次数:25  
标签:容器 run -- 深入浅出 阿里 mysql 镜像 Docker docker

(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


标签:容器,run,--,深入浅出,阿里,mysql,镜像,Docker,docker
From: https://blog.51cto.com/lenglingx/8097719

相关文章

  • Dockerfile中'COPY'和'ADD'命令的区别是什么?
    内容来自DOChttps://q.houxu6.top/?s=Dockerfile中'COPY'和'ADD'命令的区别是什么?Dockerfile中COPY和ADD命令的区别是什么,以及何时使用其中一个而不是另一个?COPY<src><dest>COPY指令将从<src>复制新文件,并将它们添加到容器的文件系统路径<dest>。ADD<src><dest>......
  • 阿里云argusagent的监控客户端的安装脚本,值得借鉴
    阿里云argusagent的监控客户端的安装脚本agent_install_necs-1.7.sh #!/bin/bashecho"installing"exportLANG=en_US.UTF-8exportLANGUAGE=en_US:#有些系统下安装后可能没有写文件的权限,导致日志文件写入失败ulimit-vunlimitedif[[-z"${VERSION}"]];thenVERS......
  • docker 分离engine和client
    背景由于我个人电脑是2020款m1,16G,256G。一方面,平时除了运行多个浏览器,还有coding编辑器等等,内存确实很紧张。其次呢,m1是ARM的架构,所以构建的镜像是无法在X86的机器上运行的。所以我尝试将docker引擎和client分开。第一步:下载二进制docker客户端文件二进制client下载链接:传送......
  • docker与docker-compose环境安装
    系统是centos7.6离线安装docker下载docker下载地址:https://download.docker.com/linux/static/stable/x86_64/docker-20.10.21.tgz安装dockertar-xvfdocker-20.10.21.tgzcpdocker/*/usr/bin离线安装docker-compose下载docker-compose普通下载地址:do......
  • Docker_报错:Host key for 47.116.79.175 has changed and you have requested strict
    Hostkeyfor47.116.79.175haschangedandyouhaverequestedstrictchecking.Hostkeyverificationfailed. 问题原因用OpenSSH的人都知ssh会把你每个你访问过计算机的公钥(publickey)都记录在~/.ssh/known_hosts。当下次访问相同计算机时,OpenSSH会核对公钥。如果公......
  • Docker使用教程
     Docker安装及使用教程(Windows版)1.下载安装2.启用windowsHyper-V虚拟引擎1.打开设置2.搜索【启用或关闭windows功能】3.勾选Hyper-V服务4、根据提示重启电脑,等待更新即可2.启动DockerDesktop3.配置加速源4.迁移镜像路径5.进入docker虚拟机的方法6.限制虚......
  • 【Java 进阶篇】深入浅出:Bootstrap 轮播图
    在现代网页设计中,轮播图是一个常见的元素。它们可以用于展示图片、广告、新闻、产品或任何您希望吸引用户注意力的内容。要实现一个轮播图,您通常需要一些复杂的HTML、CSS和JavaScript代码,这对于初学者来说可能会感到困难。但幸运的是,有一些强大的工具可以帮助我们轻松创建漂亮的轮......
  • K8s:Pod 中 command、args 与 Dockerfile 中 CMD、 ENTRYPOINT 的对应关系
    写在前面前几天被问到,这里整理笔记之前也没怎么注意这个问题理解不足小伙伴帮忙指正曾以为老去是很遥远的事,突然发现年轻是很久以前的事了。时光好不经用,抬眼已是半生,所谓的中年危机,真正让人焦虑的不是孤单、不是贫穷、更不是衰老,而是人到中年你才发现,你从来没有按照自己喜欢的方......
  • "阿里巴巴按关键字搜索接口:一键获取海量商品信息,助力商家抢占市场先机!"
    阿里巴巴按关键字搜索商品的接口是通过开放平台提供的API接口来实现的。要使用这个接口,需要进行以下步骤:确认API接口的请求地址和所需参数:需要先查看API文档,了解所要访问的API接口的请求地址和请求参数,以便正确地构造请求和获取数据。注册一个apikey和apisecret调用接入。使用apike......
  • 【Docker】Docker Compose服务依赖与健康检查
    dockercompose环境变量为增加安全性,在前面的python例子中增加redis的密码校验,密码从环境变量中获取:fromflaskimportFlaskfromredisimportStrictRedisimportosimportsocketapp=Flask(__name__)redis=StrictRedis(host=os.environ.get('REDIS_HOST','127.0.0.1')......