新建启动容器

  1. docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

常用的参数:

  • --name:为容器指定一个名称
  • -d:后台运行容器并返回容器ID,也即启动守护式容器
  • -i:以交互模式(interactive)运行容器,通常与-t同时使用
  • -t:为容器重新分配一个伪输入终端(tty),通常与-i同时使用。也即启动交互式容器(前台有伪终端,等待交互)
  • -e:为容器添加环境变量
  • -P:随机端口映射。将容器内暴露的所有端口映射到宿主机随机端口
  • -p:指定端口映射

-p指定端口映射的几种不同形式:

  • -p hostPort:containerPort:端口映射,例如-p 8080:80
  • -p ip:hostPort:containerPort:配置监听地址,例如 -p 10.0.0.1:8080:80
  • -p ip::containerPort:随机分配端口,例如 -p 10.0.0.1::80
  • -p hostPort1:containerPort1 -p hostPort2:containerPort2:指定多个端口映射,例如-p 8080:80 -p 8888:3306

    启动交互式容器

    ·以交互式的方式运行centos

    1. # -i 交互模式
    2. # -t 分配一个伪输入终端tty
    3. # centos 镜像名称
    4. # /bin/bash(或者bash) shell交互的接口
    5. docker run -it centos /bin/bash

    现在我在centos里面运行了一个centos容器。你会发现红圈的地方变了,我现在进入到容器里面了。在这个容器里面我可以执行一些linux的命令,但是命令肯定没有linux系统的全面。它和外部的linux是隔离的。
    image.png

    退出交互式容器

    方法一:

    1. # 在交互shell中exit即可退回宿主机
    2. exit

    方式一退出后容器会停止。
    方式二:
    使用快捷键ctrl + P + Q
    方式二退出后容器仍在运行

    启动守护式容器

    大部分情况下,我们系统docker容器服务时在后台运行的,可以通过-d指定容器的后台运行模式:

    1. docker run -d 容器名

    注意事项:
    如果使用docker run -d centos尝试启动守护式的centos,会发现容器启动后就自动退出了。
    因为Docker容器如果在后台运行,就必须要有一个前台进程。容器运行的命令如果不是那些一直挂起的命令(例如toptail),就会自动退出。

    列出正在运行的容器

    1. docker ps [OPTIONS]

    常用参数:

  • -a:列出当前所有正在运行的容器+历史上运行过的容器

  • -l:显示最近创建的容器
  • -n:显示最近n个创建的容器
  • -q:静默模式,只显示容器编号

    容器的启动停止操作

    启动已经停止的容器

    1. docker start 容器ID

    重启容器

    1. docker restart 容器ID

    停止容器

    1. docker stop 容器ID

    强制停止容器

    1. docker kill 容器ID

    删除容器

    删除已经停止的容器:
    1. docker rm 容器ID

    删除容器是 docker rm,删除镜像是 docker rmi,注意区分。

强制删除正在运行的容器:

  1. docker rm -f 容器ID

一次删除多个容器实例:

  1. docker rm -f $(docker ps -a -q)
  2. # 或者
  3. docker ps -a -q | xargs docker rm

查看容器日志

  1. docker logs 容器ID

常用参数:
-tf:显示日志
--tail:要显示日志的条数

查看容器内运行的进程

  1. docker top 容器ID

image.png

查看容器的元数据/详细信息

  1. docker inspect 容器ID

image.png

进入当前正在运行的容器

进入正在i云习惯你的容器,并以命令行进行交互:

  1. docker exec -it 容器ID shell交互的接口

image.png
重新进入:

  1. docker attach 容器ID

docker execdocker attach 区别:

  • attach直接进入容器启动命令的终端,不会启动新的进程,用exit退出会导致容器的停止
  • exec是在容器中打开新的终端,并且可以启动新的进程,用exit退出不会导致容器的停止

如果有多个终端,都对同一个容器执行了 docker attach,就会出现类似投屏显示的效果。一个终端中输入输出的内容,在其他终端上也会同步的显示。

文件拷贝

容器内文件拷贝到宿主机:

  1. docker cp 容器ID:容器内路径 目的主机路径

宿主机中文件拷贝到容器中:

  1. docker cp 主机路径 容器ID:容器内路径

将容器生成新的镜像commit

如何提交一个自己的镜像

docker 启动一个镜像容器后, 可以在里面执行一些命令操作,然后使用docker commit将新的这个容器快照生成一个镜像。

  1. docker commit -m="提交信息的描述" -a="提交的作者" 容器id 目标镜像名[:TAG]

举例:
比如tomcat镜像是被阉割的,默认部署了tomcat后访问出现404,没有webapps。
我们自己把这些弄好了之后,把我们弄好后的tomcat容器做成一个新的镜像。
提交到我们本地的镜像仓库中。

  1. [root@izj6cev682kqg86i4ogj8rz ~]# docker ps
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. 4a76a3c72b23 tomcat "catalina.sh run" 5 hours ago Up 5 hours 0.0.0.0:3355->8080/tcp tomcat02
  4. 08e8a0cbc58e centos "/bin/bash" 9 hours ago Up 9 hours gracious_chaum
  5. [root@izj6cev682kqg86i4ogj8rz ~]# docker commit -a="liyadong" -m="add webapps application" 4a76a3c72b23 tomcat03:1.0
  6. sha256:4942ab828f724aa87e872b47d7fb7d1f00d8a4307a2bed7eb42000393507098b
  7. [root@izj6cev682kqg86i4ogj8rz ~]# docker images
  8. REPOSITORY TAG IMAGE ID CREATED SIZE
  9. tomcat03 1.0 4942ab828f72 17 seconds ago 684MB
  10. nginx latest 605c77e624dd 5 months ago 141MB
  11. tomcat 9.0 b8e65a4d736d 5 months ago 680MB
  12. tomcat latest fb5657adc892 5 months ago 680MB
  13. mysql latest 3218b38490ce 5 months ago 516MB
  14. hello-world latest feb5d9fea6a5 8 months ago 13.3kB
  15. centos latest 5d0da3dc9764 8 months ago 231MB
  16. [root@izj6cev682kqg86i4ogj8rz ~]#

和git的commit操作很像。
从docker中央仓库拉的tomcat是镜像层,只读的,我们运行这个tomcat后会给这个镜像层上面再加一层容器层,我们做的任何操作都是在容器层里面做的。
我们又commit把这个 改动过的容器层+原始的镜像层打包提交成一个新的镜像到本地的镜像仓库,给它取个名字叫tomcat03。
然后我们运行tomcat03这个镜像,又在这个上面加一层容器层,当然这个tomcat03就是镜像层,只读。

部署项目的时候往往要部署各种各样的运行环境,一套下来可能安装五六个东西。每台服务器都这么搞肯定挺麻烦的。
我们用docker把运行环境部署好了,然后commit提交成一个镜像,之后每台服务器直接拉这个镜像,拉下来就可以直接用。省去了自己慢慢安装运行环境的步骤。