1.测试docker是否存在

  • sudo docker info
    返回docker的基本信息
    1
    2
    3
    4
    5
    6
    7
    8
    $ sudo docker info
    //出现一下内容
    Containers: 2
    Running: 0
    Paused: 0
    Stopped: 2
    Images: 1
    ...

2.运行第一个容器

1
2
3
4
5
6
7
8
9
10
11
$ sudo docker run -i -t ubuntu /bin/bash
//开始下载容器并运行
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
473ede7ed136: Pull complete
c46b5fa4d940: Pull complete
93ae3df89c92: Pull complete
6b1eed27cade: Pull complete
Digest: sha256:29934af957c53004d7fb6340139880d23fb1952505a15d69a03af0d1418878cb
Status: Downloaded newer image for ubuntu:latest
root@363ed45619ae:/#
  • 注意 可通过 docker help 或者 man docker-run 来获取 docker的命令列表
  • 解析:
    sudo docker run -i -t ubuntu /bin/bash
    其中-i 标志保证容器中STDIN是开启的,持久的标准输入,-t标志是告诉docker为要创建的容器分配一个伪tty终端。 Ubuntu是 创建一个Ubuntu镜像,同时告诉新容器中要运行:/bin/bash 命令。所以就到:root@363ed45619ae:/# 。

    3.使用容器

    其中容器ID 363ed45619ae 。 也是它的主机名。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    root@363ed45619ae:/home# hostname
    363ed45619ae
    root@363ed45619ae:/home# cat /etc/hosts
    127.0.0.1 localhost
    ::1 localhost ip6-localhost ip6-loopback
    fe00::0 ip6-localnet
    ff00::0 ip6-mcastprefix
    ff02::1 ip6-allnodes
    ff02::2 ip6-allrouters
    172.17.0.2 363ed45619ae
  • 网络配置

    1
    root@363ed45619ae:/home# ip a
  • 检查容器进程

    1
    2
    3
    4
    root@363ed45619ae:/home# ps -aux
    USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
    root 1 0.0 0.0 18508 3428 pts/0 Ss 07:34 0:00 /bin/bash
    root 21 0.0 0.0 34400 2860 pts/0 R+ 07:47 0:00 ps -aux
  • 在容器中安装软件包

    1
    root@363ed45619ae:~# apt-get upate    root@363ed45619ae:~# apt-get install vim
  • 退出容器

    1
    exit

退出后,回到自己的物理机

  • 查看当前系统中的容器列表

    1
    2
    3
    4
    5
    $ sudo docker ps -a 
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    363ed45619ae ubuntu "/bin/bash" 19 minutes ago Exited (0) 31 seconds ago keen_boyd
    31ef04a4ff1b hello-world "/hello" 3 days ago Exited (0) 3 days ago gifted_austin
    e4166694ac7c hello-world "/hello" 3 days ago Exited (0) 3 days ago brave_kare
  • 查看最后一次运行的容器

    1
    2
    3
    $ sudo docker ps -a -l
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    363ed45619ae ubuntu "/bin/bash" 20 minutes ago Exited (0) About a minute ago keen_boyd

4.容器命名

–name 标志

1
2
3
4
5
6
7
$ sudo docker run --name hiekay_container -i -t ubuntu /bin/bash
root@989f63da27d3:/# exit
exit

$ sudo docker ps -a -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
989f63da27d3 ubuntu "/bin/bash" 26 seconds ago Exited (0) 8 seconds ago hiekay_container

合法的容器名称符合: [a-zA-Z0-9_·-]

5.重启停止的容器

可以通过容器名称 或则 容器ID

1
2
3
4
5
$ sudo docker start hiekay_container
hiekay_container

$ sudo docker start 989f63da27d3
989f63da27d3

6.附着到容器上

docker容器重新启动的时候 会重启一个交互式会话shell,我们可以用 docker attach 重新附着到该容器会话上 , 可通过容器 name 或者 ID 。

1
2
3
4
5
$ sudo docker attach hiekay_container
root@989f63da27d3:/#

$ sudo docker attach 989f63da27d3
root@989f63da27d3:/#

7.创建守护式容器

除了交互式运行的容器,大部分是需要创建长期运行的容器, 守护式容器 没有交互式会话,适合运行应用程序和服务。
实例:

1
2
$ sudo docker run --name demo -d ubuntu /bin/sh -c "while true; do echo hello world; sleep1; done" 
ea6e0fecba4f5185f62e2a46851882572bdb465fccfdac6b27a64ea9ff3cedc9

其中-d参数 是标志让容器放在后台运行。
其中 命令是让 运行一个 while 循环 一直打印 hello world ,直到容器或进程停止。

  • 可通过 docker ps命令 查看 正在运行的容器
    1
    2
    3
    $ sudo docker ps                                                                                   
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    ea6e0fecba4f ubuntu "/bin/sh -c 'while t…" 2 minutes ago Up 2 minutes demo
8.查看容器内部的工作
  • docker logs
    1
    2
    3
    4
    5
    $ sudo docker logs demo
    hello world
    hello world
    hello world
    ......

也可以用 -f参数来监控日志

1
$ sudo docker logs -f demo

也可以用 tail 命令看最后的几行日志

1
2
3
sudo docker logs --tail 10  demo

sudo docker logs --tail 0 -f demo

9.查看容器内的进程

  • docker top
    1
    2
    3
    $ sudo docker top demo                                                        
    UID PID PPID C STIME TTY TIME CMD
    root 31469 31448 99 16:11 ? 00:09:46 /bin/sh -c while true; do echo hello world; sleep1; done

10.在容器内运行进程

  • docker exec
    两种类型:后台任务 和 交互式任务
  • 后台任务

    1
    $ sudo docker exec -d demo touch /etc/new_file1
  • 交互式任务

    1
    2
    $ sudo docker exec -t -i demo /bin/bash        
    root@ea6e0fecba4f:/#

11.停止守护式容器

  • docker stop name/ID

    1
    2
    3
    $ sudo docker stop demo 

    $ sudo docker stop ea6e0fecba4f
  • 注意: 也可以通过docker kill 关闭

    12.自动重启容器

  • 自动重启标志: –restart

    1
    $ sudo docker run --restart=always --name demo -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
  • 注意: –restart 被设置为 always ,无论退出代码是什么,一直会自动重启。
    还可以设置为: on-failure 只有当退出代码为0的时候才会自动重启,也可以传参数: 5, 重启次数。
    –restart=on-failure:5

    13.深入容器

  • docker inspect 获取更多容器信息

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $ sudo docker inspect demo
    //获取的信息
    [
    {
    "Id": "ea6e0fecba4f5185f62e2a46851882572bdb465fccfdac6b27a64ea9ff3cedc9",
    "Created": "2018-10-29T08:11:49.219017867Z",
    "Path": "/bin/sh",
    "Args": [
    "-c",
    "while true; do echo hello world; sleep1; done"
    ],
    ......
  • 可以用 -f 或 –format 标志来选定查看结果 ,支持完整的Go语言模板
    例子:
    查看容器的运行状态

    1
    2
    3
    $ sudo docker inspect --format='{{.State.Running}}' demo 
    //返回
    false

查看容器IP

1
$ sudo docker inspect --format='{{.NetworkSettings.IPAddress}}' demo

查看多个容器的信息

1
2
3
$ sudo docker inspect --format='{{.Name}} {{.State.Running}}' demo demo1
/demo false
/demo1 false

14.删除容器

  • docker rm name/ID

    1
    2
    $ sudo docker rm demo1                                                                                                
    demo1
  • 注意:删除之前 必须先关闭

  • 删除所有

    1
    $ sudo rm 'docker ps -a -q '

解析:docker -a 列出所有容器,-q 返回ID, 然后传给 sudo rm ID , 即可删除。

15. 小结

docker 基础,请多联系。