【docker】学docker,看此文真的足够了!

一、image镜像

1.1 查看镜像
    docker image ls
字段含义
REPOSITORY仓库地址
TAG标签
IMAGE_ID镜像ID
CREATED创建时间
SIZE镜像大小
1.2 查找镜像
    docker search ubuntu
字段含义
NAME名称
DESCRIPTION描述
STARTS星星的数量
OFFICIAL是否官方源
1.3 拉取镜像
    docker  pull docker.io/hello-world
1.4 删除镜像
    docker image rm hello-world

或者

    docker rmi hello-world
1.5 其他常用命令
命令含义语法案例
ls查看全部镜像docker image ls
search查找镜像docker search [imageName]
history查看镜像历史docker history [imageName]
inspect显示一个或多个镜像详细信息docker inspect [imageName]
pull拉取镜像docker pull [imageName]
push推送一个镜像到镜像仓库docker push [imageName]
rmi删除镜像docker rmi [imageName] docker image rmi 2
prune移除未使用的镜像,没有标记或补任何容器引用docker image prune docker image prune
tag标记本地镜像,将其归入某一仓库docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]docker tag centos:7 zhangrenyang/centos:v1
export将容器文件系统作为一个tar归档文件导出到STDOUTdocker export [OPTIONS] CONTAINERdocker export -o hello-world.tar b2712f1067a3
import导入容器快照文件系统tar归档文件并创建镜像docker import [OPTIONS] file/URL/- [REPOSITORY[:TAG]]docker import hello-world.tar
save将指定镜像保存成tar文件docker save [OPTIONS] IMAGE [IMAGE…]docker save -o hello-world.tar hello-world:latest
load加载tar文件并创建镜像docker load -i hello-world.tar
build根据Dockerfile构建镜像docker build [OPTIONS] PATH / URL / -docker build -t zf/ubuntu:v1 .

二、容器

  • docker run 命令会从 image 文件,生成一个正在运行的容器实例。
  • docker container run 命令具有自动抓取image文件的功能。如果发现本地没有指定的image文件,就会从仓库自动抓取
  • 如果我们运行hello-world容器,输出提示后,hello world就会停止运行,容器自动终止
  • 有些容器时不会自动终止的
  • image文件生成的容器实例,本身也是一个文件,称为容器文件
  • 容器生成,就会同时存在两个文件:image文件和容器文件
  • 关闭容器并不会删除容器文件,只是容器停止运行
2.1 查看有哪些容器在运行
   docker container ps 
   或
   docker container ls
2.2 查看所有容器(包括正在运行的和停止的)
   docker container ps -a
   或
   docker container ls -a
2.3 删除容器
   docker container rm [容器ID或容器名字]
2.4 常用的容器命令
命令含义案例
run从镜像运行一个容器docker run ubuntu /bin/echo 'hello-world'
ls列出容器docker container ls
inspect显示一个或多个容器详细信息docker inspect
attach要attach上去的容器必须正在运行,可以同时连接上同一个container来共享屏幕docker attach [OPTIONS] CONTAINERdocker attach 6d1a25f95132
stats显示容器资源使用统计docker container stats
top显示一个容器运行的进程docker container top
update更新一个或多个容器配置docker update -m 500m --memory-swap -1 6d1a25f95132
port列出指定的容器的端口映射docker run -d -p 8080:80 nginx docker container port containerID
ps查看当前运行的容器docker ps -a -l
kill [containerId]终止容器(发送SIGKILL )docker kill [containerId]
rm [containerId]删除容器docker rm [containerId]
start [containerId]启动已经生成、已经停止运行的容器文件docker start [containerId]
stop [containerId]终止容器运行 (发送 SIGTERM )docker stop [containerId] docker container stop $(docker container ps -aq)
logs [containerId]查看 docker 容器的输出docker logs [containerId]
exec [containerId]进入一个正在运行的 docker 容器执行命令docker container exec -it f6a53629488b /bin/bash
cp [containerId]从正在运行的 Docker 容器里面,将文件拷贝到本机docker container cp f6a53629488b:/root/root.txt .
commit [containerId]根据一个现有容器创建一个新的镜像docker commit -a "zhufeng" -m "mynginx" a404c6c174a2 mynginx:v1
  • docker容器的主线程(dockfile中CMD执行的命令)结束,容器会退出
    • 以使用交互式启动 docker run -i [CONTAINER_NAME or CONTAINER_ID]
    • tty选项 docker run -dit [CONTAINER_NAME or CONTAINER_ID]
    • 守护态(Daemonized)形式运行 docker run -d ubuntu /bin/sh -c “while true; do echo hello world; sleep 1; done”
2.5 启动容器
1. 启动容器有哪些方式
  • 方法一:启动容器
    docker run ubuntu /bin/echo "Hello world"
  • 方法二:运行交互式容器
    docker run -ti ubuntu /bin/bash
  • 方法三:后台云星容器
    docker run -d centos ping www.baidu.com

    docker run ubuntu /bin/echo "hello world"
    //容器启动后执行完立刻删除:
    docker run --rm hello-world //如果不加--rm 那么执行完容器会自动退出,但是容器还是在的
  • 命令详解:
    • docker:Docker 的二进制文件
    • run:与前面的docker组合来运行一个容器,从镜像运行成一个容器
    • ubuntu:指定要运行的镜像
      • Docker首先会从本地主机上查找镜像是否存在,如果不存在,Docker就会从镜像仓库Docker Hub下载公共镜像
    • /bin/echo “hello world”:在启动的容器里执行命令
      • Docker以ubuntu镜像创建一个新容器,然后在容器里执行 bin/echo “hello world”,然后输出结果

注意:Docker attach必须是登录到一个已经运行的容器里。需要注意的是如果从这个容器中exit退出的话,就会导致容器停止。

  • 重点参数:
参数含义举例
-i --interactive交互式
-t --tty分配一个伪终端
-d --detach运行容器到后台
-a --attach list附加到运行的容器
-e --env list设置环境变量docker run -d -p 1010:80 -e username=“zhufeng” nginx \ docker container exec -it 3695dc5b9c2d /bin/bash
-p --publish list发布容器端口到主机
-P --publish-all–publish-all
2.6 查看容器日志(非实时查看)
   docker logs 容器ID
2.7 查看容器日志(实时查看)
   docker --follow 容器ID
2.8 立刻暂停容器
   docker pause 容器ID
2.9 立刻取消暂停容器
   docker unpause 容器ID
2.10 缓慢停止容器
- 为何缓慢,是因为会清理资源
   docker stop 容器ID
2.11 立刻启动容器
   docker start 容器ID
2.12 杀掉容器
   docker kill 容器ID
2.13 删除容器
   docker container rm 容器ID //该命令执行前必须停止容器运行或杀掉容器
   
   docker container rm 容器ID -f //强行删除容器,不管你有没有在运行
2.14 删除所有容器
   docker rm $(docker ps -a -q)

   //docker ps 查看所有容器
   //docker ps -a 查看所有容器详情
   //docker ps -a -q 只查看所有容器ID
2.15 进入容器
  • 进入一个容器
   docker attach 容器ID
  • 进入正在运行的容器
   docker exec -it 容器ID 容器进入后的命令
   举例:
   docker exec -it aa305a3e35d bash
2.16 往容器里拷贝文件
   docker container cp 文件 目标容器ID:目标容器目录
   //举例:
   docker container cp a.txt 42bdc5fdb65b:/yuhua //将a.txt拷贝到容器42bdc5fdb65b的/yuhua目录下
2.17 从容器里拷贝出文件
   docker container cp 目标容器ID:文件地址 目标地址
   //举例:
   docker container cp 42bdc5fdb65b:/yuhua/a.txt .  //这是在外面的机器执行的命令,而不是在容器内部执行的
2.18 移除未使用的镜像,没标记或补任何容器引用
    docker image prune //就是用于清理一下没用的镜像
2.19 给镜像打tag
    docker tag [OPTIONS] image[:tag] [registryhost/][username/]name[:tag]
    //举例:
    docker tag swr-console:1.3.23 172.22.19.244:20202/root/swr-console:1.3.23

    docker tag a b //给a打上btag
    //镜像如果没有tag或者name,可以使用imageID代替
2.20 将容器系统做成tar包归档(类似虚拟机的快照)
  • 把容器变成tar包
    docker export -o tar包名字 容器ID
    // docker export -o a.tar 42bdc5fdb65b
2.21 将容器快照文件系统tar包导入并创建镜像
  • 把tar包变成镜像
    • 这时候的镜像的REPOSITORY和TAG都是,可以通过docker tag,这这个id的镜像打上tag
    docker import tar包名字
  • 然后再起容器
    docker run 镜像名字或ID
2.22 将制定镜像保存成tar文件
    docker save [OPTIONS] IMAGE [IMAGE...]
    //举例:
    docker save -o hello-world.tar hello-world:latest
    //将hello-world:latest镜像保存成hello-world.tar包
2.23 加载tar包并创建镜像
    docker load -i hello-world.tar
2.24 根据Dockerfile构建镜像
    docker build [OPTIONS] PATH/URL/-
    //举例:
    docker build -t yh/ubuntu:v1 .
2.25 运行完自动删除容器
    //容器启动后执行完立刻删除:
    docker run --rm hello-world //如果不加--rm 那么执行完容器会自动退出,但是容器还是在的
2.26 创建容器但不启动
    docker create IMAGENAME
    //会得到以下结果:
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS                     NAMES
    27edaef8a117        yhappstart          "/bin/sh -c 'npm sta…"   5 seconds ago       Created                                               ecstatic_franklin


3. 制作镜像

制作镜像有2种方式

  • 方式一:docker commit
  • 方式二: dockerfile
3.1 commit制作个性化镜像(很少用)
  • 以下命令就能将一个容器制作成一个新的镜像(也就是基于容器做镜像)
  • docker container commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
    • -a :提交的镜像作者
    • -c :使用Dockerfile指令来创建镜像
    • -m :提交时的说明文字
    • -p :在commit时,将容器暂停
  • 停止容器后不会自动删除这个容器,除非在启动容器的时候指定了 --rm 标志
  • 使用 docker ps -a 命令查看 Docker 主机上包含停止的容器在内的所有容器
  • 停止状态的容器的可写层仍然占用磁盘空间。要清理可以使用 docker container prune 命令
  • 举例:
    //查看容器id
    docker ps -a

    //假设选定制作镜像的容器id为81ca3872bf16

    //使用命令将容器制作成镜像
    docker container commit -m"我的nginx" -a"yuhua@qq.com" 81ca3872bf16 yuhua/mynginx:v1
    //上面的yuhua/mynginx:v1表示repo为yuhua,imageName为mynginx,tag为v1
    //上面一条命令就做好一个新的镜像了

    //查看镜像列表
    docker images

    //将yuhua/mynginx这个镜像启动成容器,-d表示后台启动
    docker run -d yuhua/mynginx:v1

    //这样就将容器制作成的新镜像启动成一个容器了
3.2 dockerfile制作镜像
  • Docker 的镜像是用一层一层的文件组成的
  • docker inspect 命令可以查看镜像或者容器
  • Layers就是镜像的层文件,只读不能修改。基于镜像创建的容器会共享这些文件层
    docker inspect centos
3.2.1 编写Dockerfile
  • -t 即-tag list 镜像名称
  • -f --file string 指定Dockerfile文件的位置
指令含义示例
FROM构建的新镜像是基于哪个镜像FROM centos:6
MAINTAINER镜像维护者姓名或邮箱地址MAINTAINER zhufengjiagou
RUN构建镜像时运行的shell命令RUN yum install httpd
CMDCMD 设置容器启动后默认执行的命令及其参数,但 CMD 能够被 docker run 后面跟的命令行参数替换CMD /usr/sbin/sshd -D
EXPOSE声明容器运行的服务器端口EXPOSE 80 443
ENV设置容器内的环境变量ENV MYSQL_ROOT_PASSWORD 123456
ADD拷贝文件或目录到镜像中,如果是URL或者压缩包会自动下载和解压ADD ,ADD https://xxx.com/html.tar.gz /var/www.html, ADD html.tar.gz /var/www/html
COPY拷贝文件或目录到镜像COPY ./start.sh /start.sh
ENTRYPOINT配置容器启动时运行的命令ENTRYPOINT /bin/bash -c ‘/start.sh’
VOLUME指定容器挂载点到宿主自动生成的目录或其它容器VOLUME ["/var/lib/mysql"
USER为 RUN CMD和ENTRYPOINT执行命令指定运行用户USER zhufengjiagou
WORKDIR为RUN CMD ENTRYPOINT COPY ADD 设置工作目录WORKDIR /data
HEALTHCHECK健康检查HEALTHCHECK --interval=5m --timeout=3s --retries=3 CMS curl -f htp://localhost
ARG在构建镜像时指定一些参数ARG user
3.2.1.1 run时的命令、ENTRYPOINT和CMD命令之间的关系(重点)

cmd给出的是一个容器的默认的可执行体。也就是容器启动以后,默认的执行的命令。重点就是这个"默认"。意味着,如果docker run没有指定任何的执行命令或者dockerfile里面也没有entrypoint,那么,就会使用cmd指定的默认的执行命令执行。同时也从侧面说明了entrypoint的含义,它才是真正的容器启动以后要执行命令

  • 执行体优先级:
    • docker run 后面的命令 > entrypoint > cmd
3.2.2 .dockerignore文件
  • 表示要排除,不要打包到image中的文件路径
    .git
    node_modules
3.2.3 Dockerfile制作
3.2.3.1 生成项目
  • 以express项目为例:
    npm install express-generator -g
    express app
3.2.3.2 写Dockerfile
    # 基于node来构建镜像,这样就有node的环境了
    FROM node
    # 拷贝项目到/yhapp
    COPY ./yhapp /yhapp
    # 设定工作目录为/yhapp
    WORKDIR /yhapp
    # 安装依赖
    RUN npm install
    # 暴露端口为3000,供别人访问
    EXPOSE 3000
3.2.3.3 写.dockerignore文件
  • 我们不希望把node_modules文件构建进去,所以需要在.dockerignore文件内写明
    .git
    node_modules
3.2.3.4 构建镜像
  • 构建前,我们的目录结构为:
    nodeapp/ --↓
             --- Dockerfile
             --- .dockerignore
             --- yhapp/
  • 执行构建命令
    docker build -t 镜像名称:tag 源文件目录
    //举例:
    docker build -t yhapp:0.0.1 . //这里最后的. 表示当前目录
3.2.3.5 运行容器
  • -p 表示端口映射
    • -p 3333:3000 表示将3333端口映射到容器内的3000端口,也就是将3000映射出来到3333,这样访问3333就能访问到3000
    docker run -p 3333:3000 -it yhapp:0.0.1 /bin.bash
    //进入容器内部,执行:
    npm start
    //这时候去curl http://localhost:3333就能得到页面
3.2.3.6 CMD加一行
  • 如果dockerfile最后再加一行

    # 基于node来构建镜像,这样就有node的环境了
    FROM node
    # 拷贝项目到/yhapp
    COPY ./yhapp /yhapp
    # 设定工作目录为/yhapp
    WORKDIR /yhapp
    # 安装依赖
    RUN npm install
    # 暴露端口为3000,供别人访问
    EXPOSE 3000

    # 再加一行cmd
    CMD npm start
  • 这样就不需要进入容器进行npm start了,在运行容器时,就会自动执行npm start命令
  • 这时候,重新制作镜像
    docker build -t yhapp:0.0.2 .
  • 重新起容器
    docker run -d -p 3333:3000 容器ID 
    //这命令最后千万不要再加命令了 因为会覆盖容器内部的CMD指令
3.2.4 发布image
docker login
docker image tag [imageName] [username]/[repository]:[tag]
docker image build -t [username]/[repository]:[tag] .

docker tag express-demo zhangrenyang/express-demo:v1
docker push zhangrenyang/express-demo:v1


数据盘

1. 使用场景

删除容器的时候,容器层里创建的文件也会被删除,如果有些数据你想要永久保存,比如Web服务器的日志,数据库管理系统中的数据,可以为容器创建一个数据盘
< img src=“https://docs.docker.com/storage/images/types-of-mounts-bind.png”>

2. bind mount、volume和和tmpfs mount之间的关系

这张图很好的说明了三者的关系:

  • bind mount是直接挂载的宿主机的文件目录,将宿主机的目录映射到容器中
  • volume是数据卷容器
  • tmpfs mount是将数据写入缓存,容器停止后就会被清理
2.1 挂载宿主机目录时数据覆盖有两个规则:
  • 如果宿主机目录下内容为空,容器映射目录有数据,则会把容器数据复制到宿主机目录
  • 如果宿主机目录下内容不为空,则会把宿主机目录下内容映射到容器里,并且容器原数据会隐藏。

docker数据卷应用场景学习查看入口


3. 数据卷volume
  • volumes: Docker管理宿主机文件系统的一部分(数据卷文件夹目录:/var/lib/docker/volumes)
  • 如果没有指定卷,则会自动创建
  • 建议使用–mount,更加通用(看下文)
3.1 创建数据卷
  • 创建一个数据卷nginx-vol
    • 这样会在数据卷默认目录/var/lib/docker/volumes下有一个nginx-vol文件夹
      ···
      docker volume create nginx-vol
      ···
3.2 查看已创建的数据卷内部结构
    docker volume inspect nginx-vol

    //得到的结构
    [
        {
            "CreatedAt": "2019-08-01T16:51:14+08:00", //创建时间
            "Driver": "local",
            "Labels": {},
            "Mountpoint": "/var/lib/docker/volumes/nginx-vol/_data", 
            "Name": "nginx-vol", //数据卷名称
            "Options": {},
            "Scope": "local" //数据卷作用法内
        }
    ]
3.3 数据卷挂载
  • 将创建的数据卷nginx-vol,挂载到某个目录下,比如/usr/share/nginx/html,则挂载后容器内这个目录的文件会同步到这个数据卷nginx-vol中,一起变化,类似捆绑了一样
  • 数据卷挂载有两种方式:
    • 方式一:
    docker run -d --name=nginx1 --mount src=nginx-vol,dst=/usr/share/nginx/html nginx
    //以上指令代码起一个nginx容器,
        // -d后台运行
        // --name=nginx1 给起的nginx容器起名为nginx1
        // --mount 表示挂载
        // src表示数据卷目录,注意:nginx-vol表示是在默认目录/var/lib/docker/volumes/下创建文件夹nginx-vol,并且内部会有_data文件夹,文件夹内部会同步dst目录下的文件
        // dst表示需要挂载到数据卷的目录
  • 注意:nginx-vol表示是在默认目录/var/lib/docker/volumes/下创建文件夹nginx-vol,并且内部会有_data文件夹,文件夹内部会同步dst目录下的文件

  • 注意:src中只需要写文件夹的名称就可以了,会自动在/var/lib/docker/volumes/下创建

    • 方式二:
    docker run -d --name=nginx2 -v nginx-vol:/usr/share/nginx/html -p 3000:80 nginx
    //以上指令表示起一个nginx容器
        // -d表示后台运行
        // --name=nginx2 给起的nginx容器起一个名字叫nginx2 
        // -v 表示映射
        // nginx-vol:/usr/share/nginx/html 表示数据卷nginx-vol挂载到容器内的html目录
        // -p 3000:80 表示映射一个端口3000到容器映射出来的的80端口,这样外部访问3000,就相当于访问容器映射的80端口
3.4 净化数据卷
  • 删除挂起的数据卷
    docker volume prune
3.5 删除数据卷
  • 删除数据卷之前,必须先删除正在该容器
    docker volume rm 数据卷名称
3.6 查看所有数据卷
    docker volume ls
3.7 列出已经孤立的数据盘
    docker volume ls -f dangling=true
3.8 列出未孤立的数据盘
    docker volume ls -f dangling=false
4. bind mount
  • bind mounts 可以存储在宿主机系统的任何位置,而volume只能在指定的docker系统的目录
  • 创建容器的时候,我们可以通过 -v 或 --volumn 给他指定一下数据盘
  • 如果源文件/目录不存在,不会自动创建,会抛出一个错误
  • 如果挂载目标在容器中非空目录,则该目录现有内容将被隐藏
4.1 默认数据盘
  • -v 参数两种挂载数据方式都可以使用
    docker run -v /mnt:/mnt -ti --name logs centos bash
  • 如果窥探该容器内部
    docker inspect logs 
    //将得到:
    "Mounts": [
        {
            "Source":"/mnt/sda1/var/lib/docker/volumes/dea6a8b3aefafa907d883895bbf931a502a51959f83d63b7ece8d7814cf5d489/_data",
            "Destination": "/mnt",
        }
    ]
- 这里的Source的值就是我们给容器指定的数据盘在主机上的位置
- 这里的Destination的值是这个数据盘在容器上的位置
4.2 指定数据盘
    mkdir ~/data
    docker run -v ~/data:/mnt -it --name logs2 centos bash
    cd /mnt
    echo 3 > 3.txt
    exit
    cat ~/data/3.txt
  • ~/data:/mnt 把当前用户目录中的data目录映射到/mnt上
4.3 指定数据盘容器
  • 第一步:创建容器不启动,这个目的是为了让别人来继承数据盘
    docker create -v /mnt:/mnt --name logger centos
  • 第二步:启动另外一个容器,并继承logger的数据盘
    docker run --volumes-from logger -ti --name=logger3 centos bash
    //进入容器后建一个文件logger3.txt
    touch logger3.txt
    //退出
    exit

    //再起一个容器并继承logger的数据盘
    docker run --volumes-from logger -ti --name=logger4 centos bash
    //进入容器后建一个文件logger4.txt
    touch logger4.txt
    //退出
    exit
  • 第三步:进入宿主机目录/mnt,你会发现,既有logger3的文件,也有logger4的文件

移除网络
  • 特别注意:移除网络,必须先删掉里面的容器
    docker network rm myweb

Compose

  • Compose 通过一个配置文件来管理多个Docker容器
  • 在配置文件中,所有的容器铜鼓services来定义,然后使用docker-compose脚本来启动、停止和重启应用和应用中的服务,以及素有依赖服务的容器
  • 注意:
    • 运行docker-compose up, Compose将启动并运行整个应用程序 配置文件组成
    • services可以定义需要的服务,每个服务都有自己的名字、使用的镜像、挂在的数据卷所属的网络和依赖的其他服务
    • newworks 是应用的网络在它下面可以定义使用的网络名称, 类型
    • volumes是数据卷,可以在此定义数据卷,然后挂在到不同的服务上面使用
个人觉得以下文章整理得蛮好的,在这里就不多写了,直接附上链接:

https://blog.csdn.net/u011781521/article/details/80464826

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值