Press "Enter" to skip to content

docker基础

概念:

  • Docker daemon( Docker守护进程)

Docker daemon是一个运行在宿主机( DOCKER-HOST)的后台进程。可通过 Docker客户端与之通信。

  • Client( Docker客户端)

Docker客户端是 Docker的用户界面,它可以接受用户命令和配置标识,并与 Docker daemon通信。图中, docker build等都是 Docker的相关命令。

  • Images( Docker镜像)

Docker镜像是一个只读模板,它包含创建 Docker容器的说明。它和系统安装光盘有点像,使用系统安装光盘可以安装系统,同理,使用Docker镜像可以运行 Docker镜像中的程序。

  • Container(容器)

容器是镜像的可运行实例。镜像和容器的关系有点类似于面向对象中,类和对象的关系。可通过 Docker API或者 CLI命令来启停、移动、删除容器。

  • Registry

Docker Registry是一个集中存储与分发镜像的服务。构建完 Docker镜像后,就可在当前宿主机上运行。但如果想要在其他机器上运行这个镜像,就需要手动复制。此时可借助 Docker Registry来避免镜像的手动复制。

一个 Docker Registry可包含多个 Docker仓库,每个仓库可包含多个镜像标签,每个标签对应一个 Docker镜像。这跟 Maven的仓库有点类似,如果把 Docker Registry比作 Maven仓库的话,那么 Docker仓库就可理解为某jar包的路径,而镜像标签则可理解为jar包的版本号。

 

docker安装:
主机环境:
[root@test01 ~]# uname -a
Linux test01 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
[root@test01 ~]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
主机地址:192.168.139.139

具体步骤:
[root@test01 ~]# curl -fsSL https://get.docker.com/ | sh
[root@test01 ~]# docker version //查看版本,默认安装最新的稳定版
Client:
Version: 18.06.0-ce
API version: 1.38
Go version: go1.10.3
Git commit: 0ffa825
Built: Wed Jul 18 19:08:18 2018
OS/Arch: linux/amd64
Experimental: false
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
或者手动配置yum源:
[root@test01 ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
[root@test01 ~]# yum install -y docker-ce //默认安装最新的稳定版
启动:
[root@test01 ~]# systemctl enable docker && systemctl start docker
卸载docker:
[root@test01 ~]# yum -y remove docker-ce

镜像相关命令:
1.搜索镜像
可使用docker search命令搜索存放在Docker Hub(这是docker官方提供的存放所有docker镜像软件的地方,类似maven的中央仓库)中的镜像.执行该命令后,Docker就会在Docker Hub中搜索含有 java这个关键词的镜像仓库.
[root@test01 ~]# docker search zabbix
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
zabbix/zabbix-server-mysql Zabbix Server with MySQL database support 110 [OK]
以上列表包含五列,含义如下:
- NAME:镜像仓库名称.
- DESCRIPTION:镜像仓库描述.
- STARS:镜像仓库收藏数,表示该镜像仓库的受欢迎程度,类似于 GitHub的 stars0
- OFFICAL:表示是否为官方仓库,该列标记为[0K]的镜像均由各软件的官方项目组创建和维护.
- AUTOMATED:表示是否是自动构建的镜像仓库.

注意:使用docker查找或下载镜像可能会超时,所以我们需要为docker配置国内的镜像加速器.

我们可以借助阿里云的镜像加速器,登录阿里云(https://cr.console.aliyun.com/#/accelerator),可以看到镜像加速地址如下图:

[root@test01 ~]# cd /etc/docker/
查看有没有 daemon.json,这是docker默认的配置文件.如果没有新建,如果有则修改.
[root@test01 docker]# vi daemon.json //xxxx根据自己实际情况修改
{
"registry-mirrors": ["https://xxxxxx.mirror.aliyuncs.com"]
}
保存退出并重启docker服务:
[root@test01 docker]# systemctl restart docker

2.下载镜像
使用命令docker pull命令即可从Docker Registry上下载镜像,执行该命令后,Docker会从Docker Hub中的java仓库下载最新版本的Java镜像.如果要下载指定版本则在java后面加冒号指定版本,例如:docker pull java:8
[root@test01 docker]# docker pull java:8
8: Pulling from library/java
5040bd298390: Pull complete
fce5728aad85: Pull complete
76610ec20bf5: Pull complete
60170fec2151: Pull complete
e98f73de8f0d: Pull complete
11f7af24ed9c: Pull complete
49e2d6393f32: Pull complete
bb9cdec9c7f3: Pull complete
Digest: sha256:c1ff613e8ba25833d2e1940da0940c3824f03f802c449f3d1815a66b7f8c0e9d
Status: Downloaded newer image for java:8
bb9cdec9c7f3: Download complete

3.列出镜像
使用docker images命令即可列出已下载的镜像
[root@test01 docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
java 8 d23bdf5b1b1b 18 months ago 643MB
以上列表含义如下
- REPOSITORY:镜像所属仓库名称.
- TAG:镜像标签.默认是latest,表示最新.
- IMAGE ID:镜像 ID,表示镜像唯一标识.
- CREATED:镜像创建时间.
- SIZE:镜像大小.

4.删除本地镜像
[root@test01 docker]# docker rmi d23bdf5b1b1b
Untagged: java:8
Untagged: java@sha256:c1ff613e8ba25833d2e1940da0940c3824f03f802c449f3d1815a66b7f8c0e9d
Deleted: sha256:d23bdf5b1b1b1afce5f1d0fd33e7ed8afbc084b594b9ccf742a5b27080d8a4a8
Deleted: sha256:0132aeca1bc9ac49d397635d34675915693a8727b103639ddee3cc5438e0f60a
Deleted: sha256:c011315277e16e6c88687a6c683e388e2879f9a195113129a2ca12f782d9fcf9
Deleted: sha256:3181aa7c07970b525de9d3bd15c4c3710a2ab49fd5927df41e5586d9b89b1480
Deleted: sha256:b0053647bc72f97b7a9709a505a20a7a74a556c6aa025979e36532ff3df7cb8d
Deleted: sha256:0877f4904e80b44741cc07706b19c6d415724b20128f4b26ee59faec9a859416
Deleted: sha256:dbf7b16cf5d32dfec3058391a92361a09745421deb2491545964f8ba99b37fc2
Deleted: sha256:4cbc0ad7007fe8c2dfcf2cdc82fdb04f35070f0e2a04d5fa35093977a3cc1693
Deleted: sha256:a2ae92ffcd29f7ededa0320f4a4fd709a723beae9a4e681696874932db7aee2c
[root@test01 docker]# docker images //没有东西,说明已删除
REPOSITORY TAG IMAGE ID CREATED SIZE

容器相关命令:
1.新建并启动容器
使用以下docker run <镜像名>命令即可新建并启动一个容器,该命令是最常用的命令,它有很多选项,下面将列举一些常用的选项.
启动nginx为例:
[root@test01 docker]# docker search nginx
[root@test01 docker]# docker pull nginx
[root@test01 docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest c82521676580 2 weeks ago 109MB
[root@test01 docker]# docker run -d -p 91:80 nginx
这样就能启动一个 Nginx容器.在本例中,为docker run添加了两个参数,含义如下:
-d 后台运行
-p 宿主机端口:容器端口 #开放容器端口到宿主机端口
访问 http://192.168.139.139:91/,将会看到nginx的主界面如下:
需要注意的是,使用docker run命令创建容器时,会先检查本地是否存在指定镜像,如果本地不存在该名称的镜像,Docker就会自动从Docker Hub下载镜像并启动一个 Docker容器.
该命令还有一个网络配置参数,如下所示:
--net选项:指定网络模式,该选项有以下可选参数:
--net=bridge:默认选项,表示连接到默认的网桥.
--net=host:容器使用宿主机的网络.
--net=container:NAME-or-ID:告诉Docker让新建的容器使用已有容器的网络配置.
--net=none:不配置该容器的网络,用户可自定义网络配置.

2.列出容器
[root@test01 docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
de64943e97b5 nginx "nginx -g 'daemon of…" 4 minutes ago Up 4 minutes 0.0.0.0:91->80/tcp infallible_joliot
如需列出所有容器(包括已停止的容器),可使用-a参数.该列表包含了7列,含义如下:
- CONTAINER_ID:表示容器 ID.
- IMAGE:表示镜像名称.
- COMMAND:表示启动容器时运行的命令.
- CREATED:表示容器的创建时间.
- STATUS:表示容器运行的状态.UP表示运行中, Exited表示已停止.
- PORTS:表示容器对外的端口号.
- NAMES:表示容器名称.该名称默认由 Docker自动生成,也可使用 docker run命令的--name选项自行指定.

3.停止容器
使用 docker stop <容器id>命令即可停止容器:
[root@test01 docker]# docker stop de64943e97b5
de64943e97b5
[root@test01 docker]# docker ps -a //状态变成了Exited,说明已经停止
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
de64943e97b5 nginx "nginx -g 'daemon of…" 7 minutes ago Exited (0) 8 seconds ago infallible_joliot

4.启动已停止的容器
使用docker run命令,即可新建并启动一个容器.对于已停止的容器,可使用 docker start <容器id>命令来启动:
[root@test01 docker]# docker start de64943e97b5
de64943e97b5
[root@test01 docker]# docker ps -a //状态变成了up,说明已经重新启动成功
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
de64943e97b5 nginx "nginx -g 'daemon of…" 8 minutes ago Up 4 seconds 0.0.0.0:91->80/tcp infallible_joliot

5.强制停止容器
可使用docker kill <容器id>命令发送 SIGKILL信号来强制停止容器:
[root@test01 docker]# docker kill de64943e97b5
de64943e97b5
[root@test01 docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
de64943e97b5 nginx "nginx -g 'daemon of…" 10 minutes ago Exited (137) 1 second ago infallible_joliot

6.查看容器所有信息
使用命令docker inspect <容器id>
[root@test01 docker]# docker inspect de64943e97b5

7.查看容器日志
使用命令docker container logs <容器id>
[root@test01 docker]# docker container logs de64943e97b5
192.168.139.1 - - [08/Aug/2018:08:35:37 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:61.0) Gecko/20100101 Firefox/61.0" "-"
192.168.139.1 - - [08/Aug/2018:08:35:37 +0000] "GET /favicon.ico HTTP/1.1" 404 169 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:61.0) Gecko/20100101 Firefox/61.0" "-"
2018/08/08 08:35:37 [error] 6#6: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 192.168.139.1, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "192.168.139.139:91"
2018/08/08 08:35:37 [error] 6#6: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 192.168.139.1, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "192.168.139.139:91"
192.168.139.1 - - [08/Aug/2018:08:35:37 +0000] "GET /favicon.ico HTTP/1.1" 404 169 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:61.0) Gecko/20100101 Firefox/61.0" "-"
192.168.139.1 - - [08/Aug/2018:08:36:40 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.1.2 Safari/605.1.15" "-"
2018/08/08 08:36:40 [error] 6#6: *3 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 192.168.139.1, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "192.168.139.139:91", referrer: "http://192.168.139.139:91/"
192.168.139.1 - - [08/Aug/2018:08:36:40 +0000] "GET /favicon.ico HTTP/1.1" 404 169 "http://192.168.139.139:91/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.1.2 Safari/605.1.15" "-"

8.查看容器里的进程
使用命令docker top <容器id>
[root@test01 docker]# docker top de64943e97b5
UID PID PPID C STIME TTY TIME CMD
root 6136 6119 0 04:45 ? 00:00:00 nginx: master process nginx -g daemon off;
101 6174 6136 0 04:45 ? 00:00:00 nginx: worker process

9.进入容器
使用docker container exec -it <容器id> /bin/bash命令用于进入一个正在运行的docker容器.如果docker run命令运行容器的时候,没有使用-it参数,就要用这个命令进入容器.一旦进入了容器,就可以在容器的 Shell 执行命令了.
[root@test01 docker]# docker container exec -it de64943e97b5 /bin/bash

10.删除容器
使用 docker rm命令即可删除指定容器
[root@test01 docker]# docker rmi de64943e97b5
该命令只能删除已停止的容器,如需删除正在运行的容器,可使用-f参数.

构建自己的docker镜像
使用Dockerfile构建自己的Docker镜像.
Dockerfile是一个文本文件,其中包含了若干条指令,指令描述了构建镜像的细.
先来编写一个最简单的Dockerfile,以前文下载的Nginx镜像为例,来编写一个Dockerfile修改该Nginx镜像的首页.
1.新建文件夹/app,在app目录下新建一个名为Dockerfile的文件,在里面增加如下内容:
[root@test01 docker]# cd /home/
[root@test01 home]# cat Dockerfile
FROM nginx //从本地的镜像仓库里拉取ngxin的docker镜像
RUN echo 'This is a test page' > /usr/share/nginx/html/index.html //修改ngxin的docker镜像的首页内容
该Dockerfile非常简单,其中的 FORM、RUN都是 Dockerfile的指令.FROM指令用于指定基础镜像,RUN指令用于执行命令.

2.在Dockerfile所在路径执行以下命令构建我们自己的ngxin镜像,构建完可用docker images命令查看是否已生成镜像ngxin:tuling:
[root@test01 home]# docker build -t nginx:test .
Sending build context to Docker daemon 22.56MB
Step 1/2 : FROM nginx
---> c82521676580
Step 2/2 : RUN echo 'This is a test page' > /usr/share/nginx/html/index.html
---> Running in ea9da007722c
Removing intermediate container ea9da007722c
---> d8d1c13a7fec
Successfully built d8d1c13a7fec
Successfully tagged nginx:test
其中-t指定镜像名字,命令最后的点(.)表示Dockerfile文件所在路径.

3.执行以下命令,即可使用该镜像启动一个Docker容器:
[root@test01 home]# docker run -d -p 92:80 nginx:test
c64562867ce255cd2eec5257c87137fc99a29d8654a4b1e90815c7caf8a382ea
[root@test01 home]# docker ps //nginx:test,说明启动成功
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c64562867ce2 nginx:test "nginx -g 'daemon of…" 3 seconds ago Up 3 seconds 0.0.0.0:92->80/tcp cranky_wiles
de64943e97b5 nginx "nginx -g 'daemon of…" 31 minutes ago Up 21 minutes 0.0.0.0:91->80/tcp infallible_joliot
[root@test01 home]#

4.访问 http://192.168.139.139:92/,可看到下图所示界面:

Dockerfile的文件编写还有如下常用指令:

注意:RUN命令在 image 文件的构建阶段执行,执行结果都会打包进入 image 文件;CMD命令则是在容器启动后执行.另外,一个 Dockerfile 可以包含多个RUN命令,但是只能有一个CMD命令.指定了CMD命令以后,docker container run命令就不能附加命令了(比如前面的/bin/bash),否则它会覆盖CMD命令.

Be First to Comment

发表评论

电子邮件地址不会被公开。 必填项已用*标注