linux-docker-03 docker的使用

linux-docker-03 docker的使用

Docker基础命令

我们以在容器内运行输出”Hello world”为例:

1
2
3
[root@localhost ~]# docker run ubuntu:15.10 /bin/echo "Hello world"
Hello world
[root@localhost ~]#

各个参数解析:

  • docker: Docker 的二进制执行文件。
  • run:与前面的 docker 组合来运行一个容器。
  • ubuntu:15.10指定要运行的镜像,Docker首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。
  • /bin/echo “Hello world”: 在启动的容器里执行的命令

  以上命令完整的意思可以解释为:Docker 以 ubuntu15.10 镜像创建一个新容器,然后在容器里执行 /bin/echo “Hello world”,然后输出结果。

运行交互式的容器

我们通过docker的两个参数 -i -t,让docker运行的容器实现交互式

1
2
3
4
[root@localhost ~]# ls
anaconda-ks.cfg
[root@localhost ~]# docker run -i -t ubuntu:15.10 /bin/bash
root@4b780a9c7b0d:/#

参数解析:

  • -t:在新容器内指定一个伪终端或终端。
  • -i:允许你对容器内的标准输入 (STDIN) 进行交互。

此时我们已进入一个 ubuntu15.10系统的容器

我们尝试在容器中运行命令 cat /proc/versionls分别查看当前系统的版本信息和当前目录下的文件列表

1
2
3
4
5
6
root@4b780a9c7b0d:/# ls
bin dev home lib64 mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr
root@4b780a9c7b0d:/# cat /proc/version
Linux version 3.10.0-862.el7.x86_64 (builder@kbuilder.dev.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC) ) #1 SMP Fri Apr 20 16:44:24 UTC 2018
root@4b780a9c7b0d:/#

我们可以通过运行exit命令或者使用CTRL+D来退出容器。

1
2
3
root@4b780a9c7b0d:/# exit
exit
[root@localhost ~]#

启动容器(后台模式)

使用以下命令创建一个以进程方式运行的容器

1
2
3
[root@localhost ~]# docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
df07331657a117b428eff4ef9fcb370347e2e851928843b7c69ca1fc0635ea83
[root@localhost ~]#

在输出中,我们没有看到期望的”hello world”,而是一串长字符

df07331657a117b428eff4ef9fcb370347e2e851928843b7c69ca1fc0635ea83

这个长字符串叫做容器ID,对每个容器来说都是唯一的,我们可以通过容器ID来查看对应的容器发生了什么。

首先,我们需要确认容器有在运行,可以通过 docker ps 来查看

1
[root@localhost ~]# docker ps

字段解析

CONTAINER ID:容器ID

NAMES:自动分配的容器名称

1Ed9zt.png

在容器内使用docker logs命令,查看容器内的标准输出

1
[root@localhost ~]# docker logs df07331657a1

1Edisf.png

1
[root@localhost ~]# docker logs nostalgic_swartz

1EdFL8.png

停止容器

我们使用 docker stop 命令来停止容器:

1
[root@localhost ~]# docker stop df07331657a1

通过docker ps查看,容器已经停止工作

1
[root@localhost ~]# docker ps

也可以用docker stop 容器名称来停止容器

1
[root@localhost ~]# docker stop nostalgic_swartz

1EdEdg.png

Docker 容器使用

Docker 客户端

输入 docker 命令来查看到 Docker 客户端的所有命令选项

1
[root@localhost ~]# docker

1EdVoQ.png

可以通过命令 docker command –help 更深入的了解指定的 Docker 命令使用方法。

例如我们要查看 docker stats 指令的具体使用方法:

1
[root@localhost ~]# docker stats --help

1Edeij.png

运行一个web应用

使用 docker 构建一个 web 应用程序。

我们在docker容器中运行一个 Python Flask 应用来运行一个web应用。

1
2
3
4
[root@localhost ~]# docker pull training/webapp
[root@localhost ~]# docker run -d -P training/webapp python app.py
010039ca1bfd81b24c2c561bc3368cd618447bceaa2d1b4d6ba6a8bddb796da8
[root@localhost ~]#

参数说明:

  • -d:让容器在后台运行。
  • -P:将容器内部使用的网络端口映射到我们使用的主机上。

查看 WEB 应用容器

使用 docker ps 来查看我们正在运行的容器,这里多了端口信息。

1EdnWn.png

  Docker 开放了 5000 端口(默认 Python Flask 端口)映射到主机端口 32768 上,这时我们可以通过浏览器访问WEB应用,输入虚拟机ip:32768即可。

1Ed3eU.png

我们也可以通过 -p 参数来设置不一样的端口

1
[root@localhost ~]# docker run -d -p 5000:5000 training/webapp python app.py

再次查看正在运行的容器

1
[root@localhost ~]# docker ps

1EdrwD.png

现在浏览器访问http://192.168.141.84:5000或者http://192.168.141.84:32768均可看到hello world

1EdsTe.png

查看容器的网络端口

可以用docker port 容器名称查看

1
2
[root@localhost ~]# docker port awesome_kepler
5000/tcp -> 0.0.0.0:5000

也可以用docker port 容器ID查看

1
2
[root@localhost ~]# docker port 613b5d636ac4
5000/tcp -> 0.0.0.0:32768

查看 WEB 应用程序日志

docker logs [ID或者名字] 可以查看容器内部的标准输出。

1
2
3
4
[root@localhost ~]# docker logs -f awesome_kepler
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
192.168.141.1 - - [27/Mar/2019 00:58:10] "GET / HTTP/1.1" 200 -
192.168.141.1 - - [27/Mar/2019 00:58:10] "GET /favicon.ico HTTP/1.1" 404 -

-f:docker logs 像使用 tail -f 一样来输出容器内部的标准输出。

从上面,我们可以看到应用程序使用的是 5000 端口并且能够查看到应用程序的访问日志。

查看WEB应用程序容器的进程

我们还可以使用 docker top 来查看容器内部运行的进程

1
[root@localhost ~]# docker top agitated_wilson

1EdcYd.png

检查 WEB 应用程序

  使用 docker inspect 来查看 Docker 的底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息。

1
[root@localhost ~]# docker inspect agitated_wilson

1Edf6P.png

停止、重启 WEB 应用容器

1
2
3
[root@localhost ~]# docker stop agitated_wilson

[root@localhost ~]# docker restart agitated_wilson

1Ed5m8.png

docker ps -l 查询最后一次创建的容器:

1
[root@localhost ~]# docker ps -l

1EdI0S.png

移除WEB应用容器

删除容器时,容器必须是停止状态,否则会报如下错误

1
2
3
[root@localhost ~]# docker rm agitated_wilson
Error response from daemon: You cannot remove a running container f1b70c57f98806b11fe24c05dadacc331f6932069336d16d6a63429f62996335. Stop the container before attempting removal or force remove
[root@localhost ~]#

我们可以使用 docker rm 命令来删除不需要的且已经停止的容器

1
[root@localhost ~]# docker rm agitated_wilson

1EdoTg.png

移除该容器之后,该网页就已经打不开了。

查看所有容器

1
[root@localhost ~]# docker ps -a

Docker使用镜像

镜像基本操作

列出镜像列表

我们可以使用 docker images 来列出本地主机上的镜像。

1
2
3
4
5
6
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest fce289e99eb9 2 months ago 1.84kB
ubuntu 15.10 9b9cb95443b5 2 years ago 137MB
training/webapp latest 6fae60ef3446 3 years ago 349MB
[root@localhost ~]#

各个字段说明:

  • REPOSITORY:表示镜像的仓库源
  • TAG:镜像的标签
  • IMAGE ID:镜像ID
  • CREATED:镜像创建时间
  • SIZE:镜像大小

  同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,如ubuntu仓库源里,有15.10、14.04等多个不同的版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。

  例如,我们如果要使用版本为15.10的ubuntu系统镜像来运行容器时,命令如下:

1
2
[root@localhost ~]# docker run -t -i ubuntu:15.10 /bin/bash 
root@5e800258838a:/#

  如果要使用版本为14.04的ubuntu系统镜像来运行容器时,命令如下:

1
[root@localhost ~]# docker run -t -i ubuntu:14.04 /bin/bash

  可以看到二者的差别仅仅是15.10与14.04的不同,但是如果你不指定一个镜像的版本标签,例如你只使用 ubuntu,docker 将默认使用 ubuntu:latest 镜像。

查找镜像

我们可以从 Docker Hub 网站来搜索镜像,Docker Hub 网址为:

https://hub.docker.com

这个网址需要翻墙才能打开,哎~

docker在中国的镜像仓库:

https://www.docker-cn.com/registry-mirror

  我们也可以使用 docker search 命令来搜索镜像。比如我们需要一个httpd的镜像来作为我们的web服务。我们可以通过 docker search 命令搜索 httpd 来寻找适合我们的镜像。

1
[root@localhost ~]# docker search httpd

NAME:镜像仓库源的名称

DESCRIPTION:镜像的描述

OFFICIAL:是否docker官方发布

获取镜像

  Docker运行容器前需要本地存在对应的镜像,如果镜像不存在,Docker 会从公共镜像仓库下载(默认Docker Hub)

1
2
3
4
5
6
7
8
9
10
11
[root@localhost ~]#  docker pull httpd
Using default tag: latest
latest: Pulling from library/httpd
27833a3ba0a5: Pull complete
7df2f4a2bf95: Pull complete
bbda6f884d14: Pull complete
eb331aac1c31: Pull complete
ef7c5393eddd: Pull complete
Digest: sha256:a7810e999e74d7e2a350ceabb11874cb4a2fbbd0e53b90dcdee40bc7532e2a06
Status: Downloaded newer image for httpd:latest
[root@localhost ~]#

下载完成后,我们可以直接使用这个镜像来运行容器。

1
[root@localhost ~]# docker run httpd

创建镜像

当我们从docker镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。

  • 1.从已经创建的容器中更新镜像,并且提交这个镜像
  • 2.使用 Dockerfile 指令来创建一个新的镜像

更新镜像

更新镜像之前,我们需要使用镜像来创建一个容器。

在运行的容器内使用 apt-get update 命令进行更新。

在完成操作之后,输入 exit命令来退出这个容器。

1
2
3
4
5
[root@localhost ~]#  docker run -t -i ubuntu:15.10 /bin/bash
root@6f96516f979d:/# apt-get update
root@6f96516f979d:/# exit
exit
[root@localhost ~]#

  此时ID为6f96516f979d的容器,是按我们的需求更改的容器。我们可以通过命令 docker commit来提交容器副本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@localhost ~]# docker commit -m="has update" -a="feng" 6f96516f979d my/ubuntu:v2
sha256:3042e8d9219ab4a49990f0262a1ebe5162667ff2b7c2620d39953ee8b0479597
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
my/ubuntu v2 3042e8d9219a 5 seconds ago 137MB
httpd latest 5eace252f2f2 14 hours ago 132MB
hello-world latest fce289e99eb9 2 months ago 1.84kB
ubuntu 15.10 9b9cb95443b5 2 years ago 137MB
[root@localhost ~]#

#docker commit的参数说明
Options:
-a, --author string Author (e.g., "John Hannibal Smith <hannibal@a-team.com>")
-c, --change list Apply Dockerfile instruction to the created image
-m, --message string Commit message
-p, --pause Pause container during commit (default true)

使用我们的新镜像 my/ubuntu 来启动一个容器

1
2
3
4
5
6
7
8
[root@localhost ~]#  docker run -d my/ubuntu:v2 /bin/sh -c "while true; do echo hello world; sleep 1; done"
58e904d93bfd755a1466b58304b1529a3854ce4f7ef098ffe5bbae6dfa483411
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
58e904d93bfd my/ubuntu:v2 "/bin/sh -c 'while t…" 3 seconds ago Up 2 seconds nostalgic_perlman
bc08980f2672 ubuntu:15.10 "/bin/bash" 13 minutes ago Up 11 minutes elated_edison
14400b5c2c28 training/webapp "python app.py" 22 minutes ago Up 22 minutes 0.0.0.0:32768->5000/tcp practical_bardeen
[root@localhost ~]#

  如下图,因为sleep和while循环,所以这个进程得以一直持续,才能用docker ps查看到,否则已执行完的进行在ps里是看不到的。

构建镜像

  我们使用命令 docker build , 从零开始来创建一个新的镜像。为此,我们需要创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像。

1
2
3
4
5
6
7
8
9
10
11
[root@localhost ~]# cat Dockerfile 
FROM centos:6.7
MAINTAINER Fisher "fisher@sudops.com"

RUN /bin/echo 'root:123456' |chpasswd
RUN useradd test
RUN /bin/echo 'test:123456' |chpasswd
RUN /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE 22
EXPOSE 80
CMD /usr/sbin/sshd -D

每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。

第一条FROM,指定使用哪个镜像源

RUN 指令告诉docker 在镜像内执行命令,安装了什么。。。

然后,我们使用 Dockerfile 文件,通过 docker build 命令来构建一个镜像。

1
[root@localhost ~]#  docker build -t test/centos:6.7 .

参数说明:

  • -t :指定要创建的目标镜像名
  • . :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径

使用docker images 查看创建的镜像已经在列表中存在,镜像ID为 f7fc7dac3d4b

1
2
3
4
5
6
7
8
9
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test/centos 6.7 f7fc7dac3d4b About a minute ago 191MB
my/ubuntu v2 3042e8d9219a 21 minutes ago 137MB
httpd latest 5eace252f2f2 15 hours ago 132MB
centos 6.7 9f1de3c6ad53 12 days ago 191MB
hello-world latest fce289e99eb9 2 months ago 1.84kB
ubuntu 15.10 9b9cb95443b5 2 years ago 137MB
[root@localhost ~]#

我们可以使用新的镜像来创建容器

可以看到新镜像已经包含我们创建的用户test

1
2
3
4
5
6
7
8
[root@localhost ~]# docker run -t -i test/centos:6.7  /bin/bash
[root@ed188df5e15d /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root sbin selinux srv sys tmp usr var
[root@ed188df5e15d /]# id test
uid=500(test) gid=500(test) groups=500(test)
[root@ed188df5e15d /]# exit
exit
[root@localhost ~]#

设置镜像标签

我们可以使用 docker tag 命令,为镜像添加一个新的标签。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test/centos 6.7 f7fc7dac3d4b 3 minutes ago 191MB
my/ubuntu v2 3042e8d9219a 23 minutes ago 137MB
httpd latest 5eace252f2f2 15 hours ago 132MB
centos 6.7 9f1de3c6ad53 12 days ago 191MB
hello-world latest fce289e99eb9 2 months ago 1.84kB
ubuntu 15.10 9b9cb95443b5 2 years ago 137MB
[root@localhost ~]# docker tag f7fc7dac3d4b test/centos:dev
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test/centos 6.7 f7fc7dac3d4b 3 minutes ago 191MB
test/centos dev f7fc7dac3d4b 3 minutes ago 191MB
my/ubuntu v2 3042e8d9219a 23 minutes ago 137MB
httpd latest 5eace252f2f2 15 hours ago 132MB
centos 6.7 9f1de3c6ad53 12 days ago 191MB
hello-world latest fce289e99eb9 2 months ago 1.84kB
ubuntu 15.10 9b9cb95443b5 2 years ago 137MB
[root@localhost ~]#

可以看到,ID为f7fc7dac3d4b的镜像多一个标签。

欢迎打赏,谢谢
------ 本文结束------
0%