[toc]
2.1 Docker守护程序
安装完Docker后,需要确认Docker的守护进程是否运行,Docker是以root权限运行它的守护程序,进而可以处理普通用户无法完成的操作(比如挂载文件系统)。 docker程序是Docker守护进程的客户端程序, 同样的也是需要以 root 的方式运行。
一般在安装完后,默认会立即启动Docker守护进程。
2.2 检查Docker守护进程是否正在运行
前面说了,安装完后,默认会立即启动Docker守护进程。
但是,如何确定是否运行了呢?
可以使用命令:sudo service docker status
如何让守护进程停止和启动呢?
sudo service docker stop
停止运行守护进程
sudo service docker start
启动守护进程
docker info
可以查看docker的信息
2.3 docker升级
升级docker非常简单,执行下面命令:
sudo apt-get update
sudo apt-get install docker-engine
2.4 开始使用Docker
有了上面的铺垫,就可以开始使用Docker。
- 使用前,请确保Docker已经准备就绪:
命令:
sudo docker info
可查看信息。 可以看到,所有有关Docker的信息全部展示出来了,包含了容器和镜像的数量,Docker使用的执行驱动和存储驱动、以及Docker的基本配置。 - 运行容器
sudo docker run -i -t ubuntu /bin/bash
bt@toto-pc:~$ sudo docker run -i -t ubuntu /bin/bash
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
345e3491a907: Pull complete
57671312ef6f: Pull complete
5e9250ddb7d0: Pull complete
Digest: sha256:cf31af331f38d1d7158470e095b132acd126a7180a54f263d386da88eb681d93
Status: Downloaded newer image for ubuntu:latest
root@60b9ae2cadd6:/#
可以看到,先提示我们本地没有这个镜像,然后Docker会自行再服务器搜索,并下载。
下面逐步解析下这行命令的含义:
- `docker run`是Docker的执行命令。
- `-i -t`是两个命令行参数,`-i`标志保证容器中的STDIN是开启的;`-t`指让Docker为创建的容器分配一个**伪tty终端**,这样新创建的容器就又一个交互式的Shell。
- 下面的是要告诉Docker要基于什么镜像创建容器,这里的`ubuntu`是一个常用镜像,也可叫**base镜像**
这个镜像保存在`Docker Hub`中,由Docker公司提供,我们可以以该镜像为基础镜像构建自己的镜像。
- 接着DOcker便在文件系统内部用该镜像创建了一个新容器,该容器拥有自己的网络、IP地址以及一个与宿主机进行通信的桥接网络接口。
- `/bin/bash`是让Docker在新容器中运行什么命令,`/bin/bash`让其启动一个**Bash shell**,,就是这个`root@60b9ae2cadd6:/# `
- 使用Docker
-
可以看到,我么以及以root用户登录到了新的容器,容器的ID是它:
60b9ae2cadd6
,没错就在这里root@60b9ae2cadd6:/#
也可以输入
hostname
获得ID
root@60b9ae2cadd6:/# hostname
60b9ae2cadd6
- 查看下
/etc/hosts
文件
root@60b9ae2cadd6:/# 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 60b9ae2cadd6
- 查看下容器中运行的进程
root@60b9ae2cadd6:/# ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 4108 3448 pts/0 Ss 13:58 0:00 /bin/bash
root 15 0.0 0.0 5896 2884 pts/0 R+ 14:19 0:00 ps -aux
-
因为在国内。必须换个源!
- 备份:
cp /etc/apt/sources.list /etc/apt/sources.list.bak
- 安装vim
apt-get update && apt-get install vim
这步可能会很慢 - 进行修改
vim /etc/apt/sources.list
- 将阿里源复制进去:
- 备份:
deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse
- 退出镜像
输入:
exit
为了确认是否退出,可以使用sudo docker ps -a
命令查看 默认情况下sudo docker ps
只能看到正在运行的容器,加了参数-a
就可以看到所有容器了,而-l
是列出最后一个运行的容器。 exit(0)代表的是正常退出
bt@toto-pc:~/code/dockerDemo$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a485d513168c ubuntu "/bin/bash" 13 minutes ago Exited (0) About a minute ago romantic_jennings
60b9ae2cadd6 ubuntu "/bin/bash" 13 days ago Exited (129) 13 days ago stoic_agnesi
ec657654e703 hello-world "/hello" 2 weeks ago Exited (0) 2 weeks ago fervent_kalam
69237704f3ef hello-world "/hello" 2 weeks ago Exited (0) 2 weeks ago hungry_kare
2.5 为容器起一个漂亮的名字
Docker会为我们创建的每一个容器自动生成一个随机的名称。但如果想指定一个名字,那就要使用--name
参数
sudo docker run --name nice_name -i -t ubuntu /bin/bash
可以注意到docker也为我们生成了独一无二的CONTAINER ID
,也可以使用ID来标识容器,不过名字还是更加好记些。
2.6 重新启动容器
sudo docker start nice_name
这个命令就可以重新启动这个叫nice_name
的容器,当然也可以使用ID,方法是一样的。
2.7 创建守护式容器
刚才创建的那个被称为交互式容器,也可以创建长期运行的容器,这就叫守护式容器。 守护式容器(daemonized container)没有交互式会话,非常适合运行应用程序和服务。很多时候都需要以守护式来运行我们的容器。
sudo docker run --name daemon_c -d ubuntu /bin/bash -c "while true; do echo hello world; sleep 1; done"
可以看到上面的命令增加了-d
参数,此参数会将容器放到后台运行。
可以看到加了-c
参数,后面有跟了一段语句,主要是每隔1s,循环打印hello word
可以使用sudo docker ps
,看下正在运行的容器是什么:
bt@toto-pc:~/code/dockerDemo$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
203c5dfb744d ubuntu "/bin/bash -c 'while…" 18 seconds ago Up 17 seconds daemon_c
要知道刚才容器是要循环打印hello word。可以使用sudo docker logs daemon_c
看下是不是打印。
$ sudo docker logs daemon_c
hello world
hello world
hello world
......
可以看到确实是在打印hello word!但是可以看到Docker会输出最后几条日志项并返回,如果加上-f
参数可以监控Docker日志
sudo docker logs -f daemon_c
可以使用ctrl+c
退出日志跟踪
也可以使用:docker logs --tail 10 daemon_c
来获取日志的最后10行内容
也可以用docker logs --tail 0 -f daemon_c
命令来跟踪某个容器的最新日志而不必读取整个日志文件。
而且,还可以使用-t 标志为每条日志项加上时间戳,
sudo docker logs -ft daemon_c
T12:40:24.014158565Z hello world
T12:40:25.016503202Z hello world
T12:40:26.018169080Z hello world
T12:40:27.122353849Z hello world
T12:40:28.124196208Z hello world
T12:40:29.126547039Z hello world
T12:40:30.135021935Z hello world
T12:40:31.136411233Z hello world
T12:40:32.138664963Z hello world
T12:40:33.141031077Z hello world
T12:40:34.143594792Z hello world
......
除了容器的日志,也可以查看容器内部运行的进程。要做到这一点,要使用sudo docker top daemon_c
命令
bt@toto-pc:~/code/dockerDemo$ sudo docker top daemon_c
UID PID PPID C STIME TTY TIME CMD
root 18935 18912 0 20:29 ? 00:00:00 /bin/bash -c while true; do echo hello world; sleep 1; done
root 20095 18935 0 20:45 ? 00:00:00 sleep 1
2.8 停止守护式容器
停止守护式容器,可以使用命令:sudo docker stop daemon_c
为了观察是否停止了,可以使用命令:sudo docker ps -n x
显示最后x个容器
bt@toto-pc:~/code/dockerDemo$ sudo docker ps -n 1
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
203c5dfb744d ubuntu "/bin/bash -c 'while…" 25 minutes ago Exited (137) About a minute ago daemon_c
2.9 自动重启容器
如果由于某种错误而导致容器停止运行,还可以通过--restart
标志,让Docker自动重新启动该容器。
--restart
标志会检查容器的退出代码,并据此来决定是否要重启容器。默认的行为是Docker不会重启容器。
sudo docker run --restart=always --name daemon_dave -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
在本例中,–restart 标志被设置为always 。无论容器的退出代码是什么,Docker都会自动重启该容器。
除了always ,还可以将这个标志设为on-failure ,这样,只有当容器的退出代码为非0值的时候,才会自动重启。另外,on-failure 还接受一个可选的重启次数参数
2.10 深入了解容器
除了通过docker ps
命令可以获取容器的信息,还可以使用docker inspect
来获得更多的容器信息,
sudo docker inspect daemon_c
bt@toto-pc:~/code/dockerDemo$ sudo docker inspect daemon_c
[
{
"Id": "203c5dfb744d88fbb1cde57112543c67d046b272f2f972f65ad59b63062314b8",
"Created": "2021-05-23T12:29:59.145857347Z",
"Path": "/bin/bash",
"Args": [
"-c",
"while true; do echo hello world; sleep 1; done"
],
"State": {
"Status": "exited",
"Running": false,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 0,
"ExitCode": 137,
"Error": "",
"StartedAt": "2021-05-23T12:30:00.003650541Z",
"FinishedAt": "2021-05-23T12:54:01.368370779Z"
},
......
docker inspect 命令会对容器进行详细的检查,然后返回其配置信息,包括名称、命令、网络配置以及很多有用的数据。
3.11 删除容器
如果容器已经不再使用,可以使用docker rm
命令来删除它们
sudo docker rm a485d513168c
删除所有容器:
sudo docker rm sudo docker ps -a -q
sudo docker ps -a -q
返回的是所有容器的id列表。
在使用docker rm
就可以删除所有列表了。
使用sudo docker rmi <id/name>
可以删除镜像
3.12 总结
- 使用:
sudo service docker status
可以看Docker守护进程的状态 sudo service docker stop
停止运行守护进程sudo service docker start
启动守护进程-
执行下面命令可以升级docker
sudo apt-get update sudo apt-get install docker-engine
- 使用
sudo docker info
可查看容器信息。 - 使用
sudo docker run -i -t ubuntu /bin/bash
可以启动ubuntu这个容器,如果该容器不再本地,会自动去云端下载,并运行/bin/bash命令,进入交互式shell窗口。 - exit()可以退出交互式Docker容器
- 使用
sudo docker ps -a
命令查看所有容器的状态 sudo docker ps
只能看到正在运行的容器,加了参数-a
就可以看到所有容器了;而加-l
可以列出最后一个运行的容器。- 使用
--name
参数,可以给容器增加名字; - 使用
sudo docker start <id/name>
命令可以重新启动这个叫<id/name>
的容器; - 增加
-d
参数会将容器放到后台运行。 - 使用
sudo docker logs <id/name>
可以查看容器日志。 - 使用
sudo docker logs -f <id/name>
-f参数可以实时监控Docker日志 - 使用
docker logs --tail 10 <id/name>
可获取日志的最后10行内容 - 使用
docker logs --tail 0 -f <id/name>
命令来跟踪某个容器的最新日志而不必读取整个日志文件。 - 使用-t 标志为每条日志项加上时间戳,
sudo docker logs -ft <id/name>
- 停止守护式容器,可以使用命令:
sudo docker stop <id/name>
- 可以通过
--restart
标志,让Docker自动重新启动该容器 - 通过
docker ps
命令可以获取容器的详细信息 - 使用
docker rm <id/name>
命令可以删除容器 - 使用sudo docker rm
sudo docker ps -a -q
可以删除所有容器 - 使用
sudo docker rmi <id/name>
可以删除镜像