Docker的一些基本操作与认知

Docker基本操作整理

安装DOCKER
yum install -y docker 
systemctl start docker  //启动docker
systemctl enable docker  //使docker开机自启
配置docker镜像加速(阿里云)

注:详见https://dev.aliyun.com/search.html,登录-管理中心-容器镜像服务-镜像加速器

ubuntu/centos:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://p9dtgk5d.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
获取镜像操作

Docker Hub 有很多镜像可以用,从 Docker Registry 获取镜像的命令是 docker pull。其命令格式为:
docker pull [选项] [Docker Registry地址]<仓库名>:<标签>
具体的选项可以通过 docker pull –help 命令看到,上面是拉取镜像的格式。

1)从docker hub拉取ubuntu镜像
# docker pull ubuntu:14.04.3     //如果不输入ubuntu的tag ‘14.04.3’,则默认拉取latest即最新版本的镜像
Trying to pull repository docker.io/library/ubuntu ... 
14.04.3: Pulling from docker.io/library/ubuntu
8387d9ff0016: Pull complete 
3b52deaaf0ed: Pull complete 
4bd501fad6de: Pull complete 
a3ed95caeb02: Pull complete 
Digest: sha256:2febbcede4f3eb82ae0dc44518a2e2a7b06a0452685e64e6b13f51b278294780
Status: Downloaded newer image for docker.io/ubuntu:14.04.3
2)查看ubuntu镜像是否下载到本地
#docker images
REPOSITORY                                                TAG                 IMAGE ID            CREATED             SIZE
docker.io/centos                                          latest              49f7960eb7e4        2 months ago        200 MB
docker.io/ubuntu                                          14.04.3             3876b81b5a81        2 years ago         188 MB
3)本地镜像都保存在docker宿主机的/var/lib/docker目录下。
#cd /var/lib/docker/
#ll
total 8
drwx------. 15 root root 4096 Dec 24 19:58 containers
drwx------.  5 root root   50 Dec 23 14:47 devicemapper
drwx------.  3 root root   25 Dec 23 13:02 image
drwxr-x---.  3 root root   18 Dec 23 13:02 network
drwx------.  6 root root 4096 Dec 24 19:58 tmp
drwx------.  2 root root    6 Dec 23 13:02 trust
drwx------.  3 root root   77 Dec 23 14:58 volumes
4)从镜像启动一个容器

例如启动ubuntu镜像

#docker run -t -i --name test_container ubuntu/14.04.3.tar:latest /bin/bash
容器操作
启动容器

新建并启动所需要的命令为 docker run。
例如,下面的命令输出一个 “running a container”,然后终止容器。

# docker run ubuntu:14.04.3 /bin/echo ' running a container '
running a container

这就类似在本地执行 /bin/echo ‘running a container’ ,基本没有区别。
下面的命令则启动一个 bash 终端,允许用户进行交互。

$ sudo docker run -t -i ubuntu:14.04.3 /bin/bash
root@dd9db09a0ea1:/# 

其中,-t 选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上, -i 则让容器的标准输入保持打开。
在交互模式下,用户可以通过所创建的终端来输入命令,例如

root@dd9db09a0ea1:/# pwd
/
root@dd9db09a0ea1:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var

当使用 docker run 来创建容器时,Docker 在后台的操作如以下几个步骤:

(1)检查本地是否存在指定的镜像,不存在就从公有仓库下载。
(2)利用镜像创建并启动一个容器。
(3)分配一个文件系统,并在只读的镜像层外面挂载一层可读写层。
(4)从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去。
(5)从地址池配置一个 ip 地址给容器。
(6)执行用户指定的应用程序。
(7)执行完毕后容器被终止。
(8)启动已终止容器。

可以利用 docker start 命令,直接将一个已经终止的容器启动运行。

#docker ps -a
CONTAINER ID        IMAGE                                               COMMAND             CREATED             STATUS                            PORTS                 NAMES
dd9db09a0ea1        ubuntu:14.04.3                                      "/bin/bash"         3 minutes ago       Exited (130) About a minute ago                         nervous_bhabha
53a1f66f9fc9        registry.cn-shanghai.aliyuncs.com/idg/lnmp:latest   "/sbin/my_init"     7 weeks ago         Up 6 weeks                        0.0.0.0:667->80/tcp   web2
395e1970c0ad        registry.cn-shanghai.aliyuncs.com/idg/lnmp:latest   "/sbin/my_init"     7 weeks ago         Up 6 weeks                        0.0.0.0:666->80/tcp   web1
[root@client ~]# docker start dd9db09a0ea1
dd9db09a0ea1

后台(background)运行:
更多的时候,需要让 Docker在后台运行而不是直接把执行命令的结果输出在当前宿主机下。此时,可以通过添加 -d 参数来实现。
下面举两个例子来说明一下。如果不使用 -d 参数运行容器。

$sudo docker run ubuntu:14.04.3 /bin/sh -c "while true; do echo hello world; sleep 1; done"
hello world
hello world
hello world
hello world

容器会把输出的结果(STDOUT)打印到宿主机上面
如果使用了 -d 参数运行容器。

$sudo docker run -d ubuntu:14.04.3 /bin/sh -c "while true; do echo hello world; sleep 1; done"
a07c7208a63d8c791ae7019c80dd63298c02187401040820ee630b2f0e210750

此时容器会在后台运行并不会把输出的结果(STDOUT)打印到宿主机上面(输出结果可以用docker logs 查看)。
容器是否会长久运行,是和docker run指定的命令有关,和 -d 参数无关。
使用 -d 参数启动后会返回一个唯一的 id,也可以通过 docker ps 命令来查看容器信息。

#docker ps
CONTAINER ID        IMAGE                                               COMMAND                  CREATED             STATUS              PORTS                 NAMES
a07c7208a63d        ubuntu:14.04.3                                      "/bin/sh -c 'while..."   34 seconds ago      Up 34 seconds                             stupefied_almeida

要获取容器的输出信息,可以通过 docker logs 命令。

$sudo docker logs [container ID or NAMES]
hello world
hello world
hello world
. . .
终止容器

可以使用 docker stop 来终止一个运行中的容器。
终止状态的容器可以用 docker ps -a 命令看到,注意容器的STATUS状态栏。例如

$sudo docker ps -a
CONTAINER ID        IMAGE                                               COMMAND                  CREATED              STATUS                       PORTS                 NAMES
a07c7208a63d        ubuntu:14.04.3                                      "/bin/sh -c 'while..."   About a minute ago   Up About a minute                                  stupefied_almeida
6a3ae5cd1706        ubuntu:14.04.3                                      "/bin/sh -c 'while..."   2 minutes ago        Exited (0) 2 minutes ago                           pensive_lewin
dd9db09a0ea1        ubuntu:14.04.3                                      "/bin/bash"              8 minutes ago        Exited (130) 7 minutes ago                         nervous_bhabha

处于终止状态的容器,可以通过 docker start 命令来重新启动。
此外,docker restart 命令会将一个运行态的容器终止,然后再重新启动它。
进入容器
在使用 -d 参数时,容器启动后会进入后台。 某些时候需要进入容器进行操作,有很多种方法,包括docker attach 命令等。下面示例如何使用docker attach命令。

$sudo docker run -idt ubuntu      //这里没有给镜像的tag,则拉取latest版本的镜像
Unable to find image 'ubuntu:latest' locally
Trying to pull repository docker.io/library/ubuntu ... 
latest: Pulling from docker.io/library/ubuntu
c64513b74145: Pull complete 
01b8b12bad90: Pull complete 
c5d85cf7a05f: Pull complete 
b6b268720157: Pull complete 
e12192999ff1: Pull complete 
Digest: sha256:3f119dc0737f57f704ebecac8a6d8477b0f6ca1ca0332c7ee1395ed2c6a82be7
Status: Downloaded newer image for docker.io/ubuntu:latest
d73272838658582e1fdb2ee1b417f54b60cfd4985bcbc35ee2267b4de66d856e

$sudo docker ps
CONTAINER ID        IMAGE                                               COMMAND                  CREATED             STATUS              PORTS                 NAMES
d73272838658        ubuntu                                              "/bin/bash"              47 seconds ago      Up 46 seconds                             xenodochial_hypatia

$sudo docker attach xenodochial_hypatia
root@d73272838658:/# 

注意:使用 attach 命令经常会无响应。当多个窗口同时 attach 到同一个容器的时候,所有窗口都会同步显示。当某个窗口因命令阻塞时,其他窗口也无法执行操作了。

docker exec -it <container_id> /bin/bash //进入容器(推荐)

容器内部操作
查看容器主机名

# docker exec -it a07c7208a63d bash
root@a07c7208a63d:/# hostname
a07c7208a63d

查看容器/etc/hosts文件

root@a07c7208a63d:/# 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.4 a07c7208a63d

查看容器接口
root@a07c7208a63d:/# ip a
1: lo:<LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
32: eth0@if33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:04 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.4/16 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:acff:fe11:4/64 scope link 
       valid_lft forever preferred_lft forever </font>
查看容器的进程

root@a07c7208a63d:/# ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 4436 676 ? Ss 03:34 0:00 /bin/sh -c while true; do echo hello world; sleep 1; done
root 1256 0.0 0.1 18168 2032 ? Ss 03:55 0:00 bash
root 1432 0.0 0.0 4336 360 ? S 03:58 0:00 sleep 1
root 1433 0.0 0.0 15560 1132 ? R+ 03:58 0:00 ps -aux

查看容器日志及相关操作
在容器级别启动syslog

[root@aly ~]# docker run --log-driver="syslog" --name test_container -d ubuntu:14.04.3 /bin/sh -c "while true; do echo hello world; sleep 1; done"
042edbe31d64d41aaca7f9337d12ba409567135e6b09562d738a9d93e03ab830

获取守护式容器的日志

[root@aly ~]# docker logs test_container
hello world
hello world
hello world
hello world

跟踪守护式容器的日志

[root@aly ~]# docker logs -f test_container
hello world
hello world
hello world
hello world

跟踪守护式容器的最新日志

[root@aly ~]# docker logs -ft test_container
2017-12-23T06:08:52.604010000Z hello world
2017-12-23T06:08:53.679457000Z hello world

查看守护式容器的进程

[root@aly ~]# docker top test_container
UID PID PPID C STIME TTY TIME CMD
root 12618 12603 0 12:00 ? 00:00:00 /bin/sh -c while true; do echo hello world; sleep 1; done
root 13221 12618 0 12:04 ? 00:00:00 sleep 1

docker stats命令查看容器占用系统资源情况

[root@aly ~]# docker stats
CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
042edbe31d64 0.00% 192 KiB / 1.796 GiB 0.01% 0 B / 648 B 0 B / 0 B 2
a07c7208a63d 0.00% 192 KiB / 1.796 GiB 0.01% 1.3 kB / 648 B 668 kB / 0 B 2
53a1f66f9fc9 0.01% 14.96 MiB / 1.796 GiB 0.81% 1.66 MB / 30.5 MB 1.13 MB / 3.41 MB 14
395e1970c0ad 0.01% 14.99 MiB / 1.796 GiB 0.81% 1.64 MB / 29.4 MB 3.24 MB / 3.41 MB 14

在容器中运行后台任务

[root@aly ~]# docker exec -d test_container touch /etc/new_file

查看容器

[root@aly ~]# docker inspect test_container
[
{
“Id”: “042edbe31d64d41aaca7f9337d12ba409567135e6b09562d738a9d93e03ab830”,
“Created”: “2018-08-06T04:00:59.302470102Z”,
“Path”: “/bin/sh”,
“Args”: [
“-c”,
“while true; do echo hello world; sleep 1; done”
],
“State”: {
“Status”: “running”,
“Running”: true,
“Paused”: false,
“Restarting”: false,
“OOMKilled”: false,
“Dead”: false,
“Pid”: 12618,
“ExitCode”: 0,
“Error”: “”,
“StartedAt”: “2018-08-06T04:00:59.53726008Z”,
“FinishedAt”: “0001-01-01T00:00:00Z”
},
……

查看容器的IP地址

[root@aly ~]# docker inspect --format='{{.NetworkSettings.IPAddress }}' test_container
172.17.0.5

导出和导入容器
导出容器

如果要导出本地某个容器,可以使用 docker export 命令。

$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7691a814370e ubuntu:14.04.3 “/bin/bash” 36 hours ago Exited (0)21 hours ago test

$ sudo docker export 7691a814370e > ubuntu.tar
这样将导出容器快照到本地文件。

导入容器快照

可以使用 docker import 从容器快照文件中再导入为镜像,例如

$ cat ubuntu.tar | sudo docker import - test/ubuntu:v1.0
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
test/ubuntu v1.0 9d37a6082e97 About a minute ago 171.3 MB

此外,也可以通过指定 URL 或者某个目录来导入,例如
$sudo docker import http://example.com/exampleimage.tgz example/imagerepo
注:用户既可以使用 docker load 来导入镜像存储文件到本地镜像库,也可以使用 docker import 来导入一个容器快照到本地镜像库。这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。

删除容器

可以使用 docker rm 来删除一个处于停止的容器。 例:

$sudo docker rm trusting_newton
trusting_newton
如果要删除一个运行中的容器,可以添加 -f 参数。Docker 会发送 SIGKILL 信号给容器。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值