zoukankan      html  css  js  c++  java
  • docker常用命令

    系统环境:CentOS7-1804

    docker版本:18.09.6

    docker服务使用只要版本相同,命令就是一样;除非是部分系统服务控制命令,不同系统稍有偏差.

    默认镜像仓库地址为docker.io,可以通过/etc/docker/daemon.json 文件来修改默认镜像仓库地址. 例如:以下操作为将docker镜像仓库地址修改为国内镜像源.

    echo '{"registry-mirrors":["https://registry.docker-cn.com"]}' > /etc/docker/daemon.json
    systemctl restart docker

    拉取镜像,通过pull拉取一个名为nginx的镜像到本地.如果不加镜像地址和版本号,默认从docker默认的仓库地址下载,镜像版本为latest

    docker pull nginx

    查看拉取的镜像

    # docker images
    REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE
    nginx                             latest              719cd2e3ed04        2 days ago          109MB

    删除镜像,通过rmi删除指定镜像,可以指定具体镜像名称:版本来删除,也可以通过IMAGE ID来删除.如果删除的镜像被某个容器所使用,则无法删除.需要先删除正在使用该镜像的容器,再删除该镜像.

    # dokcer rmi 719cd2e3ed04

    通过镜像运行一个容器,run 表示运行, -d 在后台运行, --name 给运行的容器取一个名称, 最后面为镜像名称+版本,不指定版本则默认使用latest

    # docker run -d --name test-nginx nginx
    db1b5cf1583f68a520719709e0be460cd7c2556395f7b94fe4da936683078f6a

    查看刚才运行的容器,ps 列出本机所有正在运行的容器,-a 列出本机所有容器,包括已经停止的容器

    # docker ps -a
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                    PORTS               NAMES
    db1b5cf1583f        nginx               "nginx -g 'daemon of…"   6 seconds ago       Up 5 seconds              80/tcp              test-nginx

    可以用 -q 来查看正在运行的容器ID 加上-a 可以查看所有容器的ID,包括已经停止的容器

    docker ps -q
    docker ps -qa
    docker stop `docker ps -q`  # 依次停止所有正在运行的容器

    容器的控制 start | stop | restart ,启动已经停止的容器,停止正在运行的容器,重启指定容器

    # docker stop test-nginx
    # docker start test-nginx
    # docker restart test-nginx

    上面命令运行的容器无法访问,因为没有对外映射端口.如果容器需要对外提供访问,还需要映射端口, 先删除刚才创建的容器,rm 删除容器 -f 强制删除,可以指定容器名称或CONTAINER ID来进行删除

    # docker rm -f test-nginx
    test-nginx

    创建一个新容器,并对外映射81端口提供访问, -p(小写) 指定本地要映射的端口,81:80 :前面是本地端口, :后面是容器内的端口.以下示例为将容器内的80端口映射到本地81端口以提供对外访问. -P(大写表示不指定端口,由docker随机选择一个本机端口进行映射)

    # docker run -d -p 81:80 --name test-nginx nginx
    664afe829c12b223b537723ece86f001d93f0bc46b85e2f2af345be5799f274e
    
    # 查看容器创建情况
    # docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
    664afe829c12        nginx               "nginx -g 'daemon of…"   6 seconds ago       Up 5 seconds        0.0.0.0:81->80/tcp   test-nginx
    
    # 查看本地端口监听情况
    ]# ss -apnt | grep 81
    LISTEN     0      128         :::81                      :::*                   users:(("docker-proxy",pid=15009,fd=4))

    通过浏览器访问,查看服务是否可以对外访问 

    查看容器日志, 参数logs 显示所有日志, -f 持续显示日志内容, --tail=10 显示最后10行日志

    # docker logs test-nginx
    172.23.2.124 - - [13/Jun/2019:02:45:21 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36" "-"
    
    # docker logs -f test-nginx 
    
    # docker logs -f --tail=10 test-nginx

    挂载本地内容到容器内部。例如:将本地的index.html页面替换nginx默认页面。

    -v 使用方法类似-p ,本地目录跟容器目录路径用:分隔,左边为本地路径,右边为容器路径。多个路径可以加多个 -v 。也可以挂载文件,将目录路径替换为文件路径即可。另外,挂载进容器的本地目录或文件会直接覆盖容器内的目录或文件。

    # mkdir -p /test/nginx/html/
    # echo "web site: TEST-NGINX~~~" > /test/nginx/html/index.html
    # docker rm -f test-nginx
    test-nginx
    # docker run -d -p 81:80 -v /test/nginx/html:/usr/share/nginx/html --name test-nginx nginx
    30bf3743d06ca7acde5a37ce3784d0efbd1e45c1002fa273cdb62ac0a929f6e8

    访问页面进行测试 

    docker的网络模式

    bridge模式:默认模式,容器桥接到docker0进行网络通讯
    node模式:不进行任何网络配置,无网卡、IP、路由等
    host模式:所有网络配置直接使用宿主机上的网络配置,例如,本机IP为1.1.1.1,如果创建一个nginx容器时指定网络模式为host,那该 容器的IP就是本机IP1.1.1.1 且不需要使用-p进行端口映射,端口自动对外暴露服务启动时的所有端口,可以通过ip+port直接访问。
    container模式:直接使用指定容器的网络配置,一旦通过该模式连接,两个容器之间的服务可通过localhost地址访问。

    以下是配置示例:

    docker run --network=bridge
    docker run --network=none
    docker run --network=host
    docker run --network=container:NAME_or_ID
    
    docker network create dev-net
    docker network rm dev-net
    docker run --net dev-net

    导出、导入镜像:有时部分服务器没有网络或者某些镜像未上传到镜像仓库,想在指定服务器上使用某个镜像,可以通过导出、导入的方式来复制镜像,如下示例:先用docker save命令将nginx镜像导出为tar包,然后复制到另外一台服务器上,用docker load 将tar包导入到新服务器上。因为导入镜像时一般不会导入名称和标签信息,最后用docker tag 给新导入的镜像打上标签。

    docker save 719cd2e3ed04 > nginx.tar
    docker load < nginx.tar
    docker tag 719cd2e3ed04 nginx:latest

    将指定容器制作成镜像,有时直接修改了镜像内容,想直接将该容器生成一个新镜像以做长期使用时,可以用commit命令将指定容器制作成新镜像。

    docker commit -m "changed log" CONTAINER_ID IMAGE_NAME

    进入某个容器进行操作,一般需要在制作镜像时安装bash命令行,基于该镜像创建的容器就可以通过exec -i -t 命令进入容器进行操作 exec 在运行的容器中运行命令 -i 保持连接 -t 打开一个tty终端

    docker exec -it test-nginx /bin/bash
    root@bf179274afba:/#        # 进入容器后会看到主机名称变成了容器ID

    从本地复制文件到容器中: docker cp 容器名称:容器内部具体路径 复制到本地的路径

    从容器中复制文件到本地: docker cp 本地文件或目录路径 容器名称:容器内部具体路径

    示例如下:

    docker cp nginx:/etc/nginx/nginx.conf ./
    docker cp nginx.conf nginx:/etc/nginx/

    Docker容器的重启策略如下:

    no,默认策略,在容器退出时不重启容器
    on-failure,在容器非正常退出时(退出状态非0),才会重启容器
    on-failure:3,在容器非正常退出时重启容器,最多重启3次
    always,在容器退出时总是重启容器
    unless-stopped,在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器

    Docker容器的退出状态码

    docker run的退出状态码如下: 0,表示正常退出 非0,表示异常退出(退出状态码采用chroot标准) 125,Docker守护进程本身的错误 126,容器启动后,要执行的默认命令无法调用 127,容器启动后,要执行的默认命令不存在 其他命令状态码,容器启动后正常执行命令,退出命令时该命令的返回状态码作为容器的退出状态码

    docker run的--restart选项

    通过--restart选项,可以设置容器的重启策略,以决定在容器退出时Docker守护进程是否重启刚刚退出的容器。 --restart选项通常只用于detached模式的容器。 --restart选项不能与--rm选项同时使用。显然,--restart选项适用于detached模式的容器,而--rm选项适用于foreground模式的容器。

    在docker ps查看容器时,对于使用了--restart选项的容器,其可能的状态只有Up或Restarting两种状态。

    示例:

    docker run -d --restart=always test-nginx
    docker run -d --restart=on-failure:10 test-nginx

    查看容器重启次数

    docker inspect -f "{{ .RestartCount }}" test-nginx

    查看容器最后一次的启动时间

    docker inspect -f "{{ .State.StartedAt }}" test-nginx

    volume卷:可以用来挂载到容器中持久化数据保存,当容器删除时,volume中的数据仍会保留,除非主动删除volume

    docker volume create nginx_data     # 创建一个名为nginx_data的volume卷
    docker volume ls                    # 查看现有的volume卷
    ls /var/lib/docker/volume/          # volume卷在本机上的默认路径
    docker run -d -v nginx_data:/data nginx # 将nginx_data volume挂载到容器中,

    挂载本地目录和挂载volume的区别

    挂载时如果指定了绝对路径,例如 /data:/container_data 则是挂载本机的目录到容器内,如果是相对路径形式,就会是以volume的形式挂载到容器内;例如: data:/container_data

    如果目录或者volume卷存在则直接挂载,如果不存在,则会自动创建,本机和容器内均会自动创建。

    另外如果挂载到容器内的位置有文件,本地目录挂载到容器内时,不管本地目录是否为空,都会覆盖容器内目录。volume挂载到容器时,如果volume有数据,容器内没数据,则volume覆盖容器内目录;如果volume有数据,容器内也有数据,还是volume覆盖容器内数据;如果volume为空,容器内有数据,则容器内的数据会复制到volume中,这一点挂载volume是有别于挂载本机目录的。

    ############################################################# 常用 #########################################################

    docker ps #查看运行的镜像

    docker atach "CONTAINER ID" #进入已经运行的容器名称

    #导出镜像(复制镜像到本地)
    # docker save > gitlab-runner.tar gitlab/gitlab-runner
    # gitlab/gitlab-runner 为源镜像名

    #删除这个镜像标签
    [root@localhost ~]# docker images
    REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
    vsftp                  latest              770a12f01b8b        13 days ago         252MB
    vsftpd                 v1.1                770a12f01b8b        13 days ago         252MB
    [root@localhost ~]# docker rmi vsftp:latest
    Untagged: vsftp:latest

    [root@localhost ~]# docker ps
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    a4b2ee1de7f6 gitlab/gitlab-runner:v11.11.3 "/usr/bin/dumb-init …" 6 weeks ago Up 3 weeks gitlab-runner
    ed7107f46646 gitlab/gitlab-ce:11.11.4-ce.0 "/assets/wrapper" 2 months ago Up 3 weeks (healthy) 0.0.0.0:80->80/tcp, 0.0.0.0:9090->9090/tcp, 0.0.0.0:2222->22/tcp, 0.0.0.0:8443->443/tcp gitlab


    #停掉正在运行的镜像,再删除镜像
    [root@localhost ~]# docker stop a4b2ee1de7f6 a4b2ee1de7f6

     [root@localhost ~]# docker rmi -f image 5ead7b6a6d2d
     Untagged: gitlab/gitlab-runner:v11.11.3
     Untagged: gitlab/gitlab-runner@sha256:d193aa1fe2620ab2229b46aea56efffc88c5bcb9401f268e30093e3e89c5fdff
     Deleted: sha256:5ead7b6a6d2d8b87274b77d2594a6b3e899387fde6bd8993ae21f9c8f79d0be4

    #删除所有没有正在运行的容器
    [root@localhost ~]# sudo docker rm $(sudo docker ps -a -q)
    a4b2ee1de7f6

    #docker load < gitlab-runner.tar #导入本地镜像到docker

     

    通过镜像运行一个容器,run 表示运行, -d 在后台运行, --name 给运行的容器取一个名称, 最后面为镜像名称+版本,不指定版本则默认使用latest
    
    [root@localhost ~]# docker run -d --name gitlab-runner gitlab/gitlab-runner:v11.11.3
    1487ec12891e242927b69136cce0767910d439816efd48ffbb37d5230e7609f5
    [root@localhost ~]#

    #进入已经在运行的容器

    [root@localhost ~]# docker ps
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    1487ec12891e gitlab/gitlab-runner:v11.11.3 "/usr/bin/dumb-init …" About an hour ago Up 15 minutes gitlab-runner
    ed7107f46646 gitlab/gitlab-ce:11.11.4-ce.0 "/assets/wrapper" 2 months ago Up 3 weeks (healthy) 0.0.0.0:80->80/tcp, 0.0.0.0:9090->9090/tcp, 0.0.0.0:2222->22/tcp, 0.0.0.0:8443->443/tcp gitlab
    [root@localhost ~]# docker exec -it 1487ec12891e /bin/bash #进入已经在运行的容器
    root@1487ec12891e:/# ll

    #docker: Error response from daemon: Conflict. The container name "/gitlab-runner" is already in use by container "1487ec12891e242927b69136cce0767910d439816efd48ffbb37d5230e7609f5". You have to remove (or rename) that container to be able to reuse that name.
    #经过上面一行运行容器报错情况时,因为之前运行docker容器还没有退出,导致出现容器重名情况, 所以先删除其他的容器再来启动

  • 相关阅读:
    mongoDB看这篇就够了
    放不下
    jmeter连接不上MySQL数据库的原因以及解决方法
    SecureCRT自动断开连接的解决方法
    Linux及Windows查看占用端口的进程
    网络基础知识
    selenium中driver.close()和driver.quit()的不同点
    day2_窗口句柄切换
    day6_异常捕捉
    day6_logging模块
  • 原文地址:https://www.cnblogs.com/zhiqiao/p/11459158.html
Copyright © 2011-2022 走看看