docker使用学习

Docker容器学习

docker的安装

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"
}
  • CensOS 环境安装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
  • 启动ducker
#配置加载
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
  • 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

登录到一个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

  • docker search 从 Docker Hub 查找镜像

**–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 [OPTIONS] IMAGE [IMAGE…] 查看镜像详细信息

例 docker image inspect nginx:1.22.1

docker image inspect imageid

  • docker tag 标记本地镜像,将其归入某一仓库

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 退出的时候自动删除容器

  • docker stop <container_name_or_ID> #停掉一个运行的容器\
  • cat /proc/cpuinfo 查看cpu 信息

docker ps

  • docker ps [OPTIONS] 别名属于 container ls list ps

**-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 [OPTIONS] IMAGE [IMAGE…] 将指定镜像保存成 tar 归档文件 参数 -o 输出到的文件例子

    docker save -o busybox1.tar busybox:v1.35.0

    docker save -o busybox2.tar busybox:v1.35.1 busybox:v1.35.2

    • docker load [OPTIONS] 导入使用 docker save 命令导出的镜像

    –input , -i : 指定导入的文件,代替 STDIN

    –quiet , -q : 精简输出信息

    例子 docker load -i busybox1.tar

    ​ docker load -i busybox2.tar -q

    docker history [OPTIONS] IMAGE 显示镜像历史

    -H , --human :大小和日期采用人容易读的格式展现

    **–no-trunc 😗*显示全部信息,不要隔断

    -q, --quiet: 只显示镜像 id 信息

    docker image prune 删除不使用的镜像

    -a , --all : 删除全部不使用的镜像

    **–filter filter:**指定过滤条件

    **-f, --force 😗*不提示是否删除

    docker image prune 和docker rmi 的区别

    docker rmidocker image prune 这两个命令的主要区别在于用途,前者用于删除镜像,包括指定的镜像或者所有镜像。后者则用于批量删除无用的镜像

    镜像可能是由于之前创建了没有被使用过的镜像,或者是由于之前创建并运行了容器,但是容器已经被删除。这些被称为“悬空镜像”、“孤立镜像”或者“无用镜像

    • cat /root/.docker/config.json 查看目前登录到的镜像仓库

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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 root@192.168.1.89 目标服务器路径

    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

    • 容器环境变量设置
    1. 设置多个-e

    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)]

    1. 通过配置文件来设置环境变量

    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日志的查看 可以使用docker logs container

    保存到文件中可以使用 重定向 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)]

    • mysql容器化使用

    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 用户名 ,隐射到宿主机的端口

    • redis容器化使用

    docker run -d --name redis -p8200:6379 redis:7

    docker exec -it redis bash

    redis-cli 连接redis 正常操作

    使用redis可视化工具连接容器中的redis 进行操作

    • 制作一个C++ 程序容器

    进入一个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 编译形成可执行文件 并执行

    • docker build [OPTIONS] PATH | URL |- 命令用于使用 Dockerfile 创建镜像

    **–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 <yourname@example.com>"
    
    # 在镜像中运行一些命令
    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 所在路径>
    

    存储卷操作

    创建管理卷方式一

    • docker volume create [OPTIONS] [VOLUME] 创建存储卷
  • 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)]

  • docker volume inspect [OPTIONS] VOLUME [VOLUME…] 查看卷详细信息

-f:指定相应个格式,如 json

  • docker volume ls [OPTIONS] 列出卷

–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 参数 完成目录映射

–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
  • 案例1
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目录和本地管理卷的目录绑定起来
#这时任何一边做修改,都会同时变化
  • 案例2 -v直接创建一个卷并且绑定到容器的特定目录下,ro 选项,只限制在容器是只读的,在宿主机下绑定的目录中是可写的
docker run -d --name testvolume2 -p8020:80 -v test2:/usr/share/nginx/html:ro nginx:1.24.0
# 没有test2 这个卷,就直接创建这个卷了, 容器运行绑定了目录,在容器中不能写, 但在宿主机目录下可以写
  • 使用–mount 创建卷并且绑定,
docker run -d --name testvolume3 -p8030:80 --mount src=test3,dst=/usr/share/nginx/html nginx:1.24.0
  • docker 卷声明周期管理

我们创建一个卷绑定到一个容器的特定目录,把容器删除了,卷在本地的目录依然存在,当我们把这个卷删除了,相应目录就删除了

  • 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 创建绑定卷

–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 指定参数创建
--mount '<key>=<value>,<key>=<value>'

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目录下本来有的内容
  • tmpfs_size 设置容器中卷目录容量大小,超过则报错
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  #在宿主机找不到相应的文件
  • 测试容器mysql 灾难恢复,启动一个mysql 容器,把mysql数据存储目录绑定到宿主机的一个未有的目录,在容器mysql中做一些sql常规操作
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 创建自定义网络
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 查看网络详情
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 这个容器已经连接到该网络
  • docker network disconnect [OPTIONS] NETWORK CONTAINER 断开网络

**-f:**强制退出

docker network disconnect mynet2 testnetconnect  # 再查看mynet2 就没有testnetconnect这个容器了,进入容器中,也显示没有该网络连接
  • docker network prune 删除不使用的网络

-f, --force **:**不提示

  • docker network rm 删除 1 个或者多个网络 ,如果有网络再被容器使用则会删除失败

    **-f:**强制退出

  • docker network ls 列出网络

**-f, --filter:**指定过滤条件

**–format:**指定格式

**–no-trunc:**不截断

**-q, --quiet 😗*仅仅显示 id

  • docker 网络操作
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 0网桥通信
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  看是否可以正常通信
  • 两容器使用自定义的bridge 网络 通信
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 网络

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 都是失败的

dockers-compose

  • 编写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 覆盖容器默认的 entrypoint
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)]

  • networks 指定容器运行的网络
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 指定端口映射。以下格式都可以
#完整语法
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
  • expose 暴露端口,但不映射到宿主机,只被连接的服务访问 仅可以指定内部端口为参数
version: "3.8"
services:
  web:
     image: nginx:1.24.0
     expose:
       - 8000
       - 9000
  • docker port container 参看容器的端口隐射情况
  • depends_on 设置依赖关系

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_file: .env


# 也可以是列表形式
env_file:
 - ./common.env
 - ./apps/web.env
 - /opt/secrets.env
  • docker compose [OPTIONS] COMMAND [ARGS…]

-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

  • docker compose down [options] [SERVICE…] 停止所有容器,并删除容器和网络

-v, --volumes 删除容器同时删除目录映射

docker compose down -v
  • run 该命令可以在指定服务容器上执行相关的命令
# 例如:启动一个 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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值