cat /etc/*release" # 查看系统版本
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XVaxMrKp-1689183992027)(C:\Users\VULCAN\AppData\Roaming\Typora\typora-user-images\image-20230620204907569.png)]
uname -a # 查看cpu架构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kAiFlA0R-1689183992029)(C:\Users\VULCAN\AppData\Roaming\Typora\typora-user-images\image-20230620205016701.png)]
卸载旧版本
sudo apt-get remove docker docker-engine docker.io containerd runc
使用 docker 或 docker version 检测docker是否存在
卸载历史版本
sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras -y
卸载ducker后docker的数据还存在
ll /var/lib/docker # ducker的数据路径
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QA10BT7f-1689183992029)(C:\Users\VULCAN\AppData\Roaming\Typora\typora-user-images\image-20230620210005881.png)]
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
#一些我们自定义的情况
sudo rm -rf /data/var/lib/docker
sudo rm -rf /etc/docker/daemon.json
sudo apt install cur1 -y # 一个浏览器客户端的安装
sudo mkdir -m 0755 -p /etc/apt/keyrings #创建gpg key 目录
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor --yes -o /etc/apt/keyrings/docker.gpg
cat /etc/apt/sources.list #这个指令可以查看系统源
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg]
https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee
/etc/apt/sources.list.d/docker.list > /dev/null # 把源安装在 这个路径下
sudo apt-get update #更新一下源
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y #安装
#配置加载
sudo systemctl daemon-reload
#启动服务
sudo systemctl start docker
#开启启动
sudo systemctl enable docker
#查看服务状态
sudo systemctl status docker
#查看版本
docker version
#更详细的信息
docker info
#指向hello world 命令
sudo docker run hello world
journalctl 是系统日志查看命令
-e 表示从末尾看
-u表示看那个系统组件的 ,我们的组件是docker
journalctl -eu docker
安装时 报错 启动docker-ingine失败 使用一下命令修复
systemctl daemon-reload #加载配置
systemctl start docker #重启
*docker 镜像源的修改
mkdir /etc/docker
#/etc/docker/daemon.json 中加入以下代码
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn/"]
}
Shell
#假定我们磁盘的大的目录为 /data
mkdir -p /data/var/lib/docker
# 编辑配置文件
vi /etc/docker/daemon.json
# 输入下面的 json
{
"data-root": "/data/var/lib/docker"
}
同样的方式确认docker 是否已经安装了
卸载旧版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
卸载历史版本
sudo yum remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
删除数据文件
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
#当我们有自定义路径时 如 在/data目录下
sudo rm -rf /data/var/lib/docker
sudo rm -rf /etc/docker/daemon.json
ll /etc/yum.repos.d/ #查看系统安装源配置文件
sudo yum install -y yum-utils #安装这个工具 以便后面,设置进去docker的安装源到指定目录下
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
#现在指向ll /etc/yum.repos.d/ 就多了docker安装的源
#修改为使用国内的源下载
sed -i 's@//download.docker.com@//mirrors.ustc.edu.cn/docker-ce@g' /etc/yum.repos.d/docker-ce.repo
#下载最新版本
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
#配置加载
sudo systemctl daemon-reload
#启动服务
sudo systemctl start docker
#开启启动
sudo systemctl enable docker
#查看服务状态
sudo systemctl status docker
#查看版本
docker version
#更详细的信息
docker info
#指向hello world 命令
sudo docker run hello-world
#默认数据在 /var/lib/docker
mkdir /etc/docker
#/etc/docker/daemon.json 中加入以下代码
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn/"]
}
Shell
#假定我们磁盘的大的目录为 /data
mkdir -p /data/var/lib/docker
# 编辑配置文件
vi /etc/docker/daemon.json
# 输入下面的 json
{
"data-root": "/data/var/lib/docker"
}
修改完配置都要重新加载配置 重启
#配置加载
sudo systemctl daemon-reload
#启动服务
sudo systemctl start docker
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
docker官网
http://www.docker.com
docker官方仓库地址
https://hub.docker.com/
腾讯云镜像仓库
https://cloud.tencent.com/
阿里云镜像仓库
https://www.aliyun.com/
登录到一个Docker镜像仓库 ,默认是官方仓库
docker login [OPTIONS] [SERVER]
-u 登录的用户名
-p 登录的密码
已经登录过 可以使用 docker login https::/XXXXX
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
-a : 拉取所有 tagged 镜像
**–disable-content-trust *忽略镜像的校验,默认开启
例 docker pull nginx:1.23.4
docker push [OPTIONS] NAME[:TAG] 常用参数和pull 相同
docker tag nginx:1.23.4 lcyrun/mynginx:v1.23.4
给镜像打个tag 方便push
docker push
往我们的镜像仓库push,要把名字统一到 lcyrun/镜像库名:tag
所有和 docker tag 配合使用
已经将nginx:1.23.4改为了lcyrun/mynginx:v1.23.4
可以使用docker push lcyrun/mynginx:v1.23.4
从我们的仓库pull docker pull lcyrun/mynginx:v1.23.4
**–no-trunc *显示完整的镜像描述
-f <过滤条件>:列出收藏数不小于指定值的镜像
如docker search -f stars=10 nginx 列出starts不小于10
docker logout [SERVER] 退出一个docker 镜像仓库
docker images 列出本地镜像
docker images 不带参 默认列出所有镜像
docker images nginx 则列出所有nginx的镜像
docker images nginx:tag 列出指定tag的nginx镜像
**-a *列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层)
**–digests *显示镜像的摘要信息;
○ **-f *显示满足条件的镜像;
○ **–format *指定返回值的模板文件; 如 --format json 或者默认tabel
○ **–no-trunc *显示完整的镜像信息;
○ **-q *只显示镜像 ID。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-37wqVFHy-1689183992030)(C:\Users\VULCAN\AppData\Roaming\Typora\typora-user-images\image-20230625212331044.png)]
还可以是 docker image ls ,docker image list
例 docker image inspect nginx:1.22.1
docker image inspect imageid
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
安装 nginx
卸载旧版本 yun remove nginx
centos 配置 nginx 源
rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
yum makecache 构建缓存 加快下载
yum install nginx -y
systemctl start nginx 或者 直接 nginx
停止nginx服务 直接kill master nginx 或者 systemctl stop nginx
nginx -s quit 也可以停掉nginx
默认配置路径 /ect/nginx目录下的nginx.conf,查看nginx.conf 发现它默认读取/ect/nginx/con.d/*conf,该目录下有个默认的conf 文件里面就设置了基本的主页,访问方式
docker ps 查看运行的容器 -a 包含已经停止的容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG…] 创建一个新的容器并运行一个命令 ,每个容器都有一个默认运行的命令
别名 docker container run
参数
-d: 后台运行容器,并返回容器 ID
-i: 以交互模式运行容器,通常与 -t 同时使用
-P: 随机端口映射,容器内部端口随机映射到主机的端口 docker run -d -P nginx:1.24.0 随机端口如果我们的服务器未开通此端口,可以使用curl 内部访问
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口 例 docker run -d -p 8080:80 nginx:1.24.0
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用
–name 为容器指定一个名称 docker run -d --name mynginx nginx:1.24.0
-h “mars”: 指定容器的 hostname
-e username=“ritchie”: 设置环境变量; docker run -it -h myubuntu -e myenv=test ubuntu:22.10
–cpuset-cpus=“0-2” or --cpuset-cpus=“0,1,2”: 绑定容器到指定 CPU 运行; docker run -d -it --name mynginx2 --cpuset-cpus=“0-2” nginx:1.24.0
**-m *设置容器使用内存最大值; docker run -d --name mynginx3 -m 500m nginx:1.24.0
–network=“bridge”: 指定容器的网络连接类型;
–link=[]: 添加链接到另一个容器; docker run -it --name myubuntu3 --link myubuntu2:myweb ubuntu:22.10 bash
链接是单向的
–volume , -v: 绑定一个卷
–rm :shell 退出的时候自动删除容器
**-a *显示所有的容器,包括未运行的。
**-f *根据条件过滤显示的内容。
**–format *指定返回值的模板文件。如 json 或者 table
**-l *显示 latest 的容器。
**-n *列出最近创建的 n 个容器。
**–no-trunc *不截断输出。
**-q *静默模式,只显示容器编号。
**-s *显示总的文件大小。
下载busybox
wget https://busybox.net/downloads/binaries/1.28.1-defconfig-multiarch/busybox-x86_64 --no-check-certificate
下载到文件赋予可执行权限 就可以 执行 ./busybox-x86-64 [lunux 命令]
docker rmi 删除本地的一个镜像 **-f *强制删除 **–no-prune *不移除该镜像的过程镜像,默认移除
如果一个镜像有实例化的容器,则会删除错误,必须先docker rm 删除容器,也可以使用-f强制删除
给一个镜像打tag ,就是取别名,然后docker images 显示镜像多出了取别名的那些,但是imageid是相同的,我们rmi 这些别名时,就相当于在去tag, 原始的镜像还没有删除,一个镜像打上多个tag,这些镜像就有同样的imageid,我们随便用其中一个镜像实例一个容器,然后我们可以删除这些有共同id的镜像,只有在删除最后一个镜像时会报错,因为这个镜像id还实例了这个容器
docker save -o busybox1.tar busybox:v1.35.0
docker save -o busybox2.tar busybox:v1.35.1 busybox:v1.35.2
–input , -i : 指定导入的文件,代替 STDIN
–quiet , -q : 精简输出信息
例子 docker load -i busybox1.tar
docker load -i busybox2.tar -q
-H , --human :大小和日期采用人容易读的格式展现
**–no-trunc *显示全部信息,不要隔断
-q, --quiet: 只显示镜像 id 信息
-a , --all : 删除全部不使用的镜像
**–filter filter:**指定过滤条件
**-f, --force *不提示是否删除
docker image prune 和docker rmi 的区别
docker rmi
和 docker image prune
这两个命令的主要区别在于用途,前者用于删除镜像,包括指定的镜像或者所有镜像。后者则用于批量删除无用的镜像
镜像可能是由于之前创建了没有被使用过的镜像,或者是由于之前创建并运行了容器,但是容器已经被删除。这些被称为“悬空镜像”、“孤立镜像”或者“无用镜像
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ysfRSAAO-1689183992031)(C:\Users\VULCAN\AppData\Roaming\Typora\typora-user-images\image-20230628004105438.png)]
在一台服务器上 使用 docker save -o file.tar image1,image2… 打包好镜像
可以使用scp file.tar [email protected] 目标服务器路径
scp 就是 ssh +cp 就是拷贝到指定服务器下
然后到指定服务器确定的路径下 指向 docker load -i file.tar
获取了镜像 可以正常使用
上传镜像时,如果远端已经有相同的了,就只会存一份,多次上传,就是名字不同
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
从容器创建一个新的镜像
**-a *提交的镜像作者
**-c *使用 Dockerfile 指令来创建镜像;可以修改启动指令
**-m *提交时的说明文字;
**-p *在 commit 时,将容器暂停
例子
docker run -d --name testforcommit nginx:1.24.0
docker commit testforcommit myimages:v1.0
docker commit -a lcy -m "create images" -p testforcommit myimages:v3.0
docker commit -a lcy -m "create images" -p -c 'CMD ["tail","-f","/etc/hosts"]' testforcommit myimages:v4.0
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YZpumoFI-1689183992032)(C:\Users\VULCAN\AppData\Roaming\Typora\typora-user-images\image-20230701205157564.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oHF3ONc2-1689183992032)(C:\Users\VULCAN\AppData\Roaming\Typora\typora-user-images\image-20230701210615364.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EaHii6QL-1689183992032)(C:\Users\VULCAN\AppData\Roaming\Typora\typora-user-images\image-20230701210628665.png)]
docker pause CONTAINER [CONTAINER…]
暂停容器中所有的进程
docker unpause CONTAINER [CONTAINER…]
恢复容器中所有的进程
docker export [OPTIONS] CONTAINER
导出容器内容为 tar 文件
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
从归档文件中创建镜像 和docker load 的区别是, 该命令创建的镜像会丢失 源信息 如 cmd env
**-c *应用 docker 指令创建镜像
**-m *提交时的说明文字
docker import logtest.tar mywebsize1
docker inspect mywebsize1
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VKrxi2iE-1689183992033)(C:\Users\VULCAN\AppData\Roaming\Typora\typora-user-images\image-20230701221137231.png)]
docker import -c ‘CMD [“nginx”,“-g”,“daemof off”]’ -m “create import” logtest.tar mywebsize2
docker wait CONTAINER [CONTAINER…]
阻塞运行直到容器停止,然后打印出它的退出代码
docker rename CONTAINER NEW_NAME
重命名容器
docker container prune
删除所有停止的容器
-f, --force:不提示是否进行确认
docker update [OPTIONS] CONTAINER [CONTAINER…]
–cpus: cpu 数量
–cpuset-cpus 使用哪些 cpu
–memory :内存限制
–memory-swap:交换内存
–cpu-period :是用来指定容器对 CPU 的使用要在多长时间内做一次重新分
配
–cpu-quota:是用来指定在这个周期内,最多可以有多少时间用来跑这个容器
注意设置内存限制和交换内存限制要是相同的
docker attach container 连接到一个在后台运行的容器
容器重启
docker run --restart=no [容器名] :默认值不自动重启
docker run --restart=on-failure:3 [容器名] : on-failure 若容器的退出状态非 0,则docker 自动重启容器,还可以指定重启次数,若超过指定次数未能启动容器则放弃
docker run --restart=always [容器名] :always 容器退出时总是重启
docker run --restart=unless-stopped [容器名] unless-stopped 容器退出时总是重启,
但不考虑 Docker 守护进程启动时就已经停止的容器
如果容器启动时没有设置–restart 参数,则通过下面命令进行更新:
docker update --restart=always [容器名]
重启操作并不能限制我们主动的docker stop 或 docker kill
docker run -it --rm -e mytest1=e1 -e mytest2=e3 -e mytest3=e3 41b0e86104ba bash
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Cdx3YPaE-1689183992033)(C:\Users\VULCAN\AppData\Roaming\Typora\typora-user-images\image-20230702012312903.png)]
docker run -it --rm --env-file ./envtest 41b0e86104ba bash
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hxTdLcnk-1689183992034)(C:\Users\VULCAN\AppData\Roaming\Typora\typora-user-images\image-20230702012643174.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fx73e1VH-1689183992034)(C:\Users\VULCAN\AppData\Roaming\Typora\typora-user-images\image-20230702012657416.png)]
我们可以直接借助 docker 的容器环境执行一些命令,比如容器中有某个命令而宿主机
上没有这个时候借助容器可以完成某些任务
docker run --rm --net host af2c3e96bcf1 ifconfig 使用busybox 里面的ifconfig 查看宿主机的网络
如果不带 --net host 就是查看宿主机的网络
保存到文件中可以使用 重定向 docker logs container>info.log 2>err.log 这就把日志的标准输出重定向到info.log 错误输出重定向到err.log中
方式二docker 容器的日志也存在系统的确定的路径下
cd /var/lib/docker/containers 该目录下就有每个容器的相关信息记录 包括日志,进入到一个以容器id为名的目录下,该目录下就有以id为名的日志文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WgoMt3Pw-1689183992035)(C:\Users\VULCAN\AppData\Roaming\Typora\typora-user-images\image-20230702225145036.png)]
docker run --name mysql -e MYSQL_ROOT_PASSWORD=0715636 -p8100:3306 -d mysql:5.7 本地没有该镜像,会自动到官网拉取
docker exec -it mysql bash 进入容器环境bash
mysql -u root -p 连接mysql,然后正常使用mysql
可视化工具连接容器的mysql 设置连接的ip 用户名 ,隐射到宿主机的端口
docker run -d --name redis -p8200:6379 redis:7
docker exec -it redis bash
redis-cli 连接redis 正常操作
使用redis可视化工具连接容器中的redis 进行操作
进入一个centos 容器中
docker pull centos:7
docker run -it --name myprocess centos:7 bash
设置源镜像 加速软件下载
sudo sed -e 's|^mirrorlist=|#mirrorlist=|g' \
-e 's|^#baseurl=http://mirror.centos.org/centos|baseurl=https://mirrors.ustc.edu.cn/centos|g' \
-i.bak \
/etc/yum.repos.d/CentOS-Base.repo
yum makecache 更新缓存
yum install gcc 这个centos 镜像时没有gcc 的 需要安装
可以使用vim 编写一个.c 文件 用GCC 编译形成可执行文件 并执行
**–build-arg=[] *设置镜像创建时的变量;
○ **-f *指定要使用的 Dockerfile 路径;
○ **–label=[] *设置镜像使用的元数据;
○ **–no-cache *创建镜像的过程不使用缓存;
○ **–pull *尝试去更新镜像的新版本;
○ **–quiet, -q *安静模式,成功后只输出镜像 ID;
○ **–rm *设置镜像成功后删除中间容器;
○ –tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构
建中为一个镜像设置多个标签。
○ –network: 默认 default。在构建期间设置 RUN 指令的网络模式
Dockerfile 文件示例
# 指定基础镜像
FROM ubuntu:latest
# 设置作者信息
LABEL maintainer="Your Name "
# 在镜像中运行一些命令
RUN apt-get update && apt-get install -y \
curl \
wget \
&& rm -rf /var/lib/apt/lists/*
# 设置工作目录
WORKDIR /app
# 复制本地文件到镜像中
COPY . .
# 暴露端口
EXPOSE 8080
# 容器启动时运行的命令
CMD ["python", "app.py"]
docker build -t <镜像名称> <Dockerfile 所在路径>
docker build -t <镜像名称> <Dockerfile 所在路径>
创建管理卷方式一
volume docker 管理卷,默认映射到宿主机的/var/lib/docker/volumes 目录下
-d, --driver:指定驱动,默认是 local
–label:指定元数据
docker volume create --label user=lcy myvolumetest2
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8i9qkSVA-1689183992036)(C:\Users\VULCAN\AppData\Roaming\Typora\typora-user-images\image-20230704004903422.png)]
-f:指定相应个格式,如 json
–format:指定相应个格式,如 json,table
–filter,-f: 过滤
-q: 仅显示名称
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CIoJjxgc-1689183992037)(C:\Users\VULCAN\AppData\Roaming\Typora\typora-user-images\image-20230704005640077.png)]
docker volume rm [OPTIONS] VOLUME [VOLUME…]
-f,–force: 强制删除
docker volume prune [OPTIONS] 删除不使用的本地卷 对没用使用的匿名卷做了清除, 命名卷则没有删除
–filter:过滤
-f, --force :不提示是否删除
创建管理卷方式二 -v 或者–mount创建
docker run -v name:directory[:options] …
第一个参数:卷名称
第二个参数:卷映射到容器的目录
第三个参数: 选项,如 ro 表示 readonly
docker run -d --name mynginx0 -v volumeng:/usr/share/nginx/html/ nginx:1.24.0
这里没有指定文件权限,我们进入到这个容器删除/usr/share/nginx/html/ 的50x.html退出容器回到宿主机,可以看到绑定的目录下对应文件也删除了
docker run -d --name mynginx1 -v volumeng1:/usr/share/nginx/html/:ro nginx:1.24.0 加上了ro 参数 只读的
文件就不能删除
–mount '=,=‘
type : 类型表示 bind, volume, or tmpfs
source **,**src :对于命名卷,这是卷的名称。对于匿名卷,省略此字段。
destination,**dst,target:文件或目录挂载在容器中的路径
ro,readonly: 只读方式挂载
docker run -d --name testmount --mount 'src=volume1,dst=/usr/share/nginx/html' nginx:1.24.0
docker create volume test1 # 创建命名管理卷
docker run -d --name testvolume1 -p8010:80 -v test1:/usr/share/nginx/html nginx:1.24.0
# 把启动一个容器 并且把容器/usr/share/nginx/html目录和本地管理卷的目录绑定起来
#这时任何一边做修改,都会同时变化
docker run -d --name testvolume2 -p8020:80 -v test2:/usr/share/nginx/html:ro nginx:1.24.0
# 没有test2 这个卷,就直接创建这个卷了, 容器运行绑定了目录,在容器中不能写, 但在宿主机目录下可以写
docker run -d --name testvolume3 -p8030:80 --mount src=test3,dst=/usr/share/nginx/html nginx:1.24.0
我们创建一个卷绑定到一个容器的特定目录,把容器删除了,卷在本地的目录依然存在,当我们把这个卷删除了,相应目录就删除了
docker 卷共享 把一个卷绑定到多个容器, 本地目录内容修改了会同步到绑定的容器上
-v 参数创建绑定卷
docker run -v name:directory[:options] …
第一个参数:宿主机目录,这个和管理卷是不一样的
第二个参数:卷映射到容器的目录
第三个参数:选项,如 ro 表示 readonly
docker run -d --name testbing1 -v /root/data/testbind:/usr/share/nginx/html nginx:1.24.0 #创建绑定卷
# 这里宿主机目录和容器目录对应上,先同步宿主机内容到容器中
–mount ‘=,=’
type : 类型表示 bind, volume, or tmpfs
source **,**src :宿主机目录,这个和管理卷是不一样的
destination**,**dst,target:文件或目录挂载在容器中的路径
ro,readonly: 只读方式挂载
docker run -d --name testbind2 --mount type=bind,src=/root/data/testbind,dst=/usr/share/nginx/html nginx:1.24.0
–mount 创建绑定卷案例 如果宿主机目录不存在,则容器无法创建, 如果宿主机目录和容器目录都存在,则以宿主机目录为准
-v 创建绑定卷案例 如果宿主机目录不存在,则创建目录,然后对象容器目录也是一个空目录,如果两个目录都存在,则以宿主机目录为准
绑定卷共享 两个绑定卷绑定到宿主机同一个目录下, 这是宿主机目录下内容修改了会同步到两个容器上 效果和管理卷是相同的
临时卷数据位于内存中,在容器和宿主机之外
tmpfs 局限性
不同于卷和绑定挂载,不能在容器之间共享 tmpfs 挂载。
这个功能只有在 Linux 上运行 Docker 时才可用
方式一:指定**–tmpfs** 创建
docker run -d --name testtemp1 --tmpfs /test nginx:1.24.0 # 是在内存中,所以宿主机没有绑定什么位置,只要指定容器内的目录即可,临时卷,容器停掉,容器中该目录的内容就清空了
--mount '=,='
type : 类型表示 bind, volume, or tmpfs
destination**,**dst,target:挂载在容器中的路径
tmpfs-size**:**tmpfs 挂载的大小(以字节为单位)。默认无限制。
tmpfs-mode**:**tmpfs 的八进制文件模式。例如,700 或 0770。默认为 1777
docker run -d --name testtemp2 --mount type=tmpfs,dst=/test nginx:1.24.0
tmpfs创建临时卷,绑定到容器特定目录,如果容器中该目录本身就存在,还是会清空里面的内容
docker run -d --name testtemp3 --mount type=tmpfs,dst=/usr/share/nginx/html -p 8050:80 nginx:1.24.0
#这里就会清空容器/usr/share/nginx/html目录下本来有的内容
docker run -d --name testtemp4 --mount type=tmpfs,dst=/usr/share/nginx/html,tmpfs-size=1m -p 8051:80 nginx:1.24.0
#我们先拷贝一个大于1m的文件到容器/目录 ,然后mv busybox1.tar /usr/share/nginx/html/ 报错
测试 首先创建一个普通容器,在容器一个目录下创建文件,到宿主机下看能不能找到这个对应文件并查看内容
然后又创建一个容器,绑定一个临时卷,在卷目录下创建文件,到宿主机下看能不能找到这个对应文件并查看内容
docker run -d --name testtmpfs1 nginx:1.24.0
find / -name testfortmpfs # 可以在宿主机找到相应的文件
docker run -d --name testtmpfs2 --tmpfs /usr/share/nginx/html nginx:1.24.0
find / -name testfortmpfs2 #在宿主机找不到相应的文件
docker run -d --name mysqltest -e MYSQL_ROOT_PASSWORD=lcy -it -v /data/mywordkir/mysql-data:/var/lib/mysql mysql:5.7 #这里就在宿主机上创建了/data/mywordkir/mysql-data目录同步了容器对应目录的内容
docker exec -it mysqltest bash # 登录mysql 进行一些常规操作
docker rm -f mysqltest # 删除这个mysql 容器
docker run -d --name mysqltestnew -e MYSQL_ROOT_PASSWORD=lcy -it -v /data/mywordkir/mysql-data:/var/lib/mysql mysql:5.7 # 新启动一个mysql 容器,绑定卷宿主机目录还是原来的目录
docker exec -it mysqltest bash # 登录mysql 可以看到数据还是原来那个mysql容器的数据
docker network create [OPTIONS] NETWORK
-d, --driver:网络驱动 默认 bridge 可选 host overlay none
--gateway:网关地址
--subnet:表示网段的 CIDR 格式的子网
--ipv6:启用 ipv6
docker network create mynet1 --subnet=192.168.0.0/16
docker network inspect [OPTIONS] NETWORK [NETWORK...]
-f,--format:指定格式
docker network connect 将容器连接到网络。可以按名称或 ID 连接容器。 一旦连接,容器可以与同
一网络中的其他容器通信。
docker network connect [OPTIONS] NETWORK CONTAINER
--ip:指定 IP 地址
--ip6:指定 IPv6 地址
docker network create mynet2 --subnet=10.2.0.0/16
docker run -dit --name testnetconnect busybox:1.36.0
docker exec -it testnetconnect sh
ifconfig #显示没有链接到我们自定义的网络
docker network connect mynet2 testnetconnect # 退到宿主机bash 执行连接命令在 回到容器中
ifconfig #有显示连接到我们自定义的网络
docker network inspect mynet2 # 可以看到testnetconnect 这个容器已经连接到该网络
**-f:**强制退出
docker network disconnect mynet2 testnetconnect # 再查看mynet2 就没有testnetconnect这个容器了,进入容器中,也显示没有该网络连接
-f, --force **:**不提示
docker network rm 删除 1 个或者多个网络 ,如果有网络再被容器使用则会删除失败
**-f:**强制退出
docker network ls 列出网络
**-f, --filter:**指定过滤条件
**–format:**指定格式
**–no-trunc:**不截断
**-q, --quiet *仅仅显示 id
docker network create mynet1 --subnet=10.3.0.0/16 #创建一个自定义网络
docker run -dit --name netbusybox1 --network mynet1 busybos:1.36.0 # 启动一个容器并指定网络
docker run -dit --name netbusybox2 busybox:1.36.0 # 没有指定网络,则会连接到默认的 docker0 桥 bridge
docker network connect mynet1 netbusybox2 # 再将netbusybox2连接到mynet1 ,那该容器就连接了两个网络
docker network disconnect mynet1 netbusybox1
docker network disconnect mynet1 netbusybox2
docker network rm mynet1 #没有容器用该网络,可以删除了 那netbusybox2 还是有连接到bridge netbusybox1则只有一个127.0.0.1
docker run -dit --name b1 busybox:1.36.0
docker run -dit --name b2 busybox:1.36.0 # 创建了两个容器 网络都是默认网络bridge
docker exec -it netbusybox1 sh # 分别在两个回话中 查看ip ifconfig
docker exec -it netbusybox2 sh
ping ip # 互相ping 看是否可以正常通信
docker network create mynet4 # 不带参数默认就是 bridge 网络
docker run -dit --name b3 --network mynet4 busybox:1.36.0
docker run -dit --name b4 --network mynet4 busybox:1.36.0
# 然后也是分别进入到各自容器,查看ip 后 互相ping
Docker 自定义桥接网络是支持通过 Docker DNS 服务进行域名解析的, 也就是说我们
可以直接使用容器名进行通信,因为 DNS 服务可以解析容器名到 IP 地址的映射, 但
是默认的 bridge 网络是不支持 DNS 的
# 容器 b1 b2 都是连接在默认网络 bridge 进入容器后
# ping b2 ping b1 错误
docker run -dit --name b3 --network mynet4 busybox:1.36.0
docker run -dit --name b4 --network mynet4 busybox:1.36.0 # b3 b4 都连接到 mynet4 桥接网络
ping b4 ping b3 可以通信
docker port container 查看容器端口情况
host 网络 容器直接使用宿主机的网络,占用宿主机的端口资源
docker run -dit --name b51 --network=host busybox:1.36.0 # 使用host 网络,进入容器中ifconfig 信息和宿主机配置一样
docker run -d --name testhost --network=host nginx:1.24.0 #容器要使用宿主机的80端口,但80端口已被占用,容器启动失败
docker ps -a | grep testhost
docker logs testhost # 查看信息可知容器启动失败
Docker Container 的 other container 网络模式是 Docker 中一种较为特别的网络的模式。之所以称为“other container 模式”,是因为这个模式下的 Docker Container,会使用其他容器的网络环境。之所以称为“特别”,是因为这个模式下容器的网络隔离性会处于 bridge 桥接模式与 host 模式之间。Docker Container 共享其他容器的网络环境,则至少这两个容器之间不存在网络隔离,而这两个容器又与宿主机以及除此之外其他的容器存在网络隔离。
案例 启动容器 b61 ,容器b62 网络直接使用b61的,然后停掉b61 在查看b62 网络配置,在启动b61 在查看
docker run -dit --name b61 busybox:1.36.0 # b61有默认桥接网络 虚拟ip mac
docker run -dit --name b62 --network container:b61 busybox:1.36.0 #b62使用容器网络,共用b61的网络配置,所以ip、mac都是一样的,在宿主机查看b62容器信息可以看到网络配置都是空的,现在停掉b61 在查看b62的网络就只剩本地环回了,
# 然后重启b61,并且重启b62后再看b62发现又恢复一起的网络配置了
docker none **网络 ** none 网络就是指没有网络。挂在这个网络下的容器除了 lo(本地回环),没有其他任何
网卡。
docker run -dit --name b7 --network=none busybox:1.36.0 #创建一个none网络容器
# 进入容器ifconfig 发现只有本地环回, 这是ping 宿主机,docker 0 或者其他ip 都是失败的
编写docker-compose.yml 文件,在一个特定目录下编写这个文件,文件中可以设置project 字段,为项目设置名称,没有设置默认以所在目录名为名称
在yaml文件中,使用空格来表示缩进,不要使用制表符。每个缩进级别是两个空格。缩进的数量和位置非常重要,它们用于表示键值对和嵌套关系
image 在 docker-compose.yml 文件中指定服务启动容器所用的镜像
mkdir proj1
vim docker-compose.yml
version: "3.8" # 一个简单的例子, 指定版本,服务为web ,使用指定镜像启动nginx
services:
web:
image: nginx:1.24.0
#编写完成后
docker compose up -d # 该指令就会自动读取本目录下的docker-compose.yml后台运行服务,为其创建网络、容器
docker compose down #停掉服务,删除相应容器、网络
command 覆盖容器启动的默认命令
version: "3.8"
services:
web:
image: nginx:1.24.0
command: ["tail","-f","/etc/hosts"]
#command: tail -f /etc/hosts # 也可以写成这种形式
docker inspect proj2-web-1
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K0yS0HKB-1689183992038)(C:\Users\VULCAN\AppData\Roaming\Typora\typora-user-images\image-20230710005822273.png)]
默认command 是
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-srFbN0k2-1689183992039)(C:\Users\VULCAN\AppData\Roaming\Typora\typora-user-images\image-20230710010152759.png)]
启动nginx
如果是默认命令,执行
docker exec -it proj1-web-1 curl 127.0.0.1 # 会返回首页
docker exec -it proj1-web-2 curl 127.0.0.1 # 因为修改了命令,并没用启动nginx 服务,所以这里是失败的
entrypoint: /code/entrypoint.sh
# 也可以是一下格式
version: "3.8"
services:
web:
image: nginx:1.24.0
entrypoint:
- tail
- -f
- /etc/hosts
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a1tykK8Y-1689183992040)(C:\Users\VULCAN\AppData\Roaming\Typora\typora-user-images\image-20230710011215131.png)]
environment 添加环境变量。您可以使用数组或字典、任何布尔值,布尔值需要用引号引起来,以
确保 YML 解析器不会将其转换为 True 或 False
version: "3.8"
services:
web:
image: nginx:1.24.0
entrypoint:
- tail
- -f
- /etc/hosts
environment:
- TEST=1
- FALG="True"
- FA=True
# 也可以是字典形式 如
environment:
RACK_ENV: development
SHOW: "true"
USER_INPUT:
docker exec -it proj3-web-1 bash
env # 效果如下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pzbPdTbC-1689183992040)(C:\Users\VULCAN\AppData\Roaming\Typora\typora-user-images\image-20230710012330106.png)]
version: "3.8"
services:
web:
image: nginx:1.24.0
networks: # 给这个服务的容器配置了两个网络
- net1
- net2
buy:
image: busybox:1.36.0
networks:
- net1 # 这里同理
networks: # 指定生成的网络
net1:
net2:
docker compose config 检测当前目录下的docker-compose.yml 文件,没问题就回显出来它的完整格式
volumes 将主机的数据卷或者文件挂载到容器里
version: "3.8"
services:
web:
image: nginx:1.24.0
volumes:
- type: volume # 管理卷 完整语法
source: ymlvolumes
target: /usr/share/nginx/html
volume:
nocopy: true
- type: bind # 绑定卷
source: /root/data/html
target: /usr/share/nginx/html
volumes:
ymlvolumes:
services: # 短语法 之间创建绑定卷
db:
image: postgres:latest
volumes:
- /localhost/postgres.sock:/var/run/postgres/postgres.sock
#完整语法
ports:
- target: 80
host_ip: 127.0.0.1
published: 8080
protocol: tcp
mode: host
- target: 80
host_ip: 127.0.0.1
published: 8000-9000
protocol: tcp
mode: host
# 短语法
version: "3.8"
services:
web:
image: nginx:1.24.0
ports:
- 8700
- 8989:80
version: "3.8"
services:
web:
image: nginx:1.24.0
expose:
- 8000
- 9000
docker compose up :以依赖性顺序启动服务
docker compose up SERVICE :自动包含 SERVICE 的依赖项
docker compose stop :按依赖关系顺序停止服务
docker compose start 启动
version: "3.8"
services:
web:
image: nginx:1.24.0
depends_on:
db:
condition: service_healthy
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: 0708
healthcheck:
test: mysql -u root -p 0708 -e 'show databases;'
interval: 10s
timeout: 5s
retries: 10
env_file: .env
# 也可以是列表形式
env_file:
- ./common.env
- ./apps/web.env
- /opt/secrets.env
-f, --file 指定使用的 Compose 模板文件,默认为 docker-compose.yml,可以多次指定
-p, --project-name 指定项目名称,默认将使用所在目录名称作为项目名
cd.. #从 proj8 回到上一级 目录
docker compose -f ./proj8/docker-compose.yml -pproj_8 up -d
docker compose -f ./proj8/docker-compose.yml -pproj_88 up -d
# 以同一份模板文件,启动两个项目,只要项目名不同即可
up 该命令的作用十分强大,它会尝试自动完成包括构建镜像、(重新)创建服务、启动服
务并关联服务相关容器的一系列操作,可以直接通过该命令来启动一个项目
-d 在后台运行服务容器, 推荐在生产环境下使用该选项
–force-recreate 强制重新创建容器,不能与 --no-recreate 同时使用
–no-recreate 如果容器已经存在了,则不重新创建,不能与 --force-recreate 同时使用
docker compose up -d # 这次运行 环境变量 TEST=1
docker compose up -d --force-recreate # 先修改文件使TEST=2 然后重新创建容器 ,查看发现TEST=2生效
docker compose up -d --no-recreate # 先修改文件使 TEST=3 然后执行次命令 发现TEST还是2
-v, --volumes 删除容器同时删除目录映射
docker compose down -v
# 例如:启动一个 ubuntu 服务容器,并执行 ping docker.com 命令
# docker compose run ubuntu ping docker.com
docker compose run [options] SERVICE [COMMAND] [ARGS...]
-d 后台运行容器
–name NAME 为容器指定一个名字
–entrypoint CMD 覆盖默认的容器启动指令
-e KEY=VAL 设置环境变量值,可多次使用选项来设置多个环境变量
-u, --user=“” 指定运行容器的用户名或者 uid
–rm 运行命令后自动删除容器
-p, --publish=[] 映射容器端口到本地主机
docker compose run -d --name myrun web # docker run 是选择一个镜像来运行 这里是选择一个服务,如web
docker compose run --name myrun2 web curl www.baidu.com # 使用web服务来执行curl命令
version: "3.8"
services:
web:
image: nginx:1.24.0
environment:
TEST: 3
ports:
- 8090:80
networks:
- myservicenet
volumes:
- ./html:/usr/share/nginx/html
depends_on:
mysql:
condition: service_healthy
redis:
condition: service_healthy
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: lcy99
volumes:
- ./lib:/var/lib/mysql
networks:
- myservicenet
healthcheck:
test: mysql -u root -plcy99 -e "select 1;"
interval: 10s
timeout: 5s
retries: 10
redis:
image: redis:7
networks:
- myservicenet
healthcheck:
test: redis-cli ping
interval: 10s
timeout: 5s
retries: 10
networks:
myservicenet:
docker compose up -d
docker compose down
version: "3.8"
services:
wordpress:
image: wordpress
restart: always
depends_on:
db:
condition: service_healthy
ports:
- 8070:80
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: mywordpressuser
WORDPRESS_DB_PASSWORD: mywordpresspass
WORDPRESS_DB_NAME: wordpress
volumes:
- ./wordpress/:/var/www/html
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: wordpress
MYSQL_USER: mywordpressuser
MYSQL_PASSWORD: mywordpresspass
volumes:
- ./mysqlvarlib/:/var/lib/mysql
healthcheck:
test: mysql -u root -proot -e "select 1;"
interval: 10s
timeout: 5s
retries: 10