Ubuntu16.04+
在Ubuntu系统中安装较为简单,官方提供了脚本供我们进行安装。
sudo apt install curl curl -fsSL get.docker.com -o get-docker.sh sudo sh get-docker.sh --mirror Aliyun
执行这个命令后,脚本就会自动的将一切准备工作做好,并且把Docker CE 的Edge版本安装在系统中。
启动Docker CE
sudo systemctl enable docker sudo systemctl start docker
建立docker 用户组
默认情况下,docker 命令会使用Unix socket 与Docker 引擎通讯。而只有root 用户和docker 组的用户才可以访问Docker 引擎的Unix socket。出于安全考虑,一般Ubuntu系统上不会直接使用root 用户。因此,更好地做法是将需要使用docker 的用户加入docker用户组。
注销当前用户,重新登录Ubuntu,输入docker info,此时可以直接出现信息。
配置国内镜像加速
在/etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件)
{ "registry-mirrors": [ "https://registry.docker-cn.com" ] }
重新启动服务
1
2
|
sudo systemctl daemon-reload sudo systemctl restart docker |
IV. Docker的C/S模式
Docker 采用了C/S 架构,包括客户端和服务端。Docker 守护进程(Daemon)作为服务端
接受来自客户端的请求,并处理这些请求(创建、运行、分发容器)。
Docker 守护进程一般在宿主主机后台运行,等待接收来自客户端的消息;Docker 客户端则为用户提供一系列可执行命令,用户用这些命令实现跟Docker 守护进程交互。我们之前在Win10的命令行中便是最主要的客户端:
Docker也为我们提供了Remote API来操作Docker的守护进程,也意味着我们可以通过自己的程序来控制Docker的运行。客户端和服务端既可以运行在一个机器上,也可通过socket 或者RESTful API 来进行通信:
至于Docker的客户端与守护进程之间的通信,其连接方式为socket连接。主要有三种socket连接方式:
unix:///var/run/docker.sock
tcp://host:port
fd://socketfd
完整的Docker的C/S连接方式的本质可以一般表示为如下:
V. 使用Docker
容器的基本操作
启动一次操作容器:docker run IMAGE_NAME [COMMAND] [ARG…]
例如,启动一个容器输出hello world。由于刚装上Docker,没有任何镜像,所以会先下载一个最新的ubuntu18.04的docker镜像。一次操作容器在处理完操作后会立即关闭容器。
1
|
docker run ubuntu echo 'hello world' |
启动交互式容器:docker run -t -i –name=自定义名称 IMAGE_NAME /bin/bash
-i –interactive=true | false,默认是false
-t –tty=true | false,默认是false
–name 给启动的容器自定义名称,方便后续的容器选择操作
启动交互式的容器,就是类似虚拟机、云主机的操作方式,操作完一个命令后仍然可以继续:
1
|
docker run -i -t ubuntu /bin/bash |
查看容器:docker ps [-a] [-l]
省略 列出正在运行的容器
-a all 列出所有容器
-l latest 列出最近的容器
查看指定容器:docker inspect name | id
name指代具体的容器名称,id则是容器的唯一id标识。inspect命令可以详细的展示出容器的具体信息。
1
|
docker inspect haha |
重新启动停止的容器:docker start [-i] 容器名
实际使用时,没必要每次都重新启动一个新的容器,我们可以重新启动之前创建的容器,现实情况也需要我们这样使用。
1
|
docker start -i haha |
删除停止的容器:docker rm name | id
1
2
|
docker rm thirsty_kepler docker rm upbeat_albattani |
守护式容器
交互式容器在运行完命令退出后即停止,而实际中我们常常需要能够长时间运行,即使退出也能后台运行的容器,而守护式容器具备这一功能。守护式容器具有:
- 能够长期运行;
- 没有交互式会话;
- 适合于运行应用程序和服务。
以守护形式运行容器
我们执行完需要的操作退出容器时,不要使用exit退出,可以利用Ctrl+P Ctrl+Q代替,以守护式形式退出容器。
附加到运行中的容器
退出正在运行的容器,想要再次进入,需要使用attach命令:docker attach name | id
1
|
docker attach haha |
启动守护式容器
启动守护式容器,可以在后台为我们执行操作:docker run -d IMAGE_NAME [COMMAND] [ARG…]
当命令在后台执行完毕,容器还是会关闭。这里防止容器立刻退出,写一个脚本循环输出“hello world”。
1
|
docker run --name hiahia -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done" |
查看容器日志
当守护式容器在后台运行时,我们可以利用docker的日志命令查看其输出:docker logs [-f] [-t] [–tail] IMAGE_NAME
-f –follows=true | false,默认是false,显示更新
-t –timestamps=true | false,默认是false,显示时间戳
–tail=“all” | 行数,显示最新行数的日志
查看容器内进程
对运行的容器查看其进程:docker top IMAGE_NAME
运行中容器启动新进程
Docker的理念是一个容器运行一个服务,但是往往需要对一个服务进行监控,所以也需要在已经运行服务的容器启动新的进程:docker exec [-d] [-i] [-t] IMAGE_NAME [COMMAND] [ARG…]
1
|
docker exec -i -t hiahia /bin/bash |
停止守护式容器
发送信号停止容器:docker stop 容器名
强制停止:docker kill 容器名
VI. 案例:在容器中部署静态网站
容器的端口映射
命令:run [-P] [-p]
-P,–publish-all=true | false,大写的P表示为容器暴露的所有端口进行映射;
-p,–publish=[],小写的p表示为容器指定的端口进行映射,有四种形式:
- containerPort:只指定容器的端口,宿主机端口随机映射;
- hostPort:containerPort:同时指定容器与宿主机端口一一映射;
- ip::containerPort:指定ip和容器的端口;
- ip:hostPort:containerPort:指定ip、宿主机端口以及容器端口。
例如:
1
2
3
4
|
docker run -p 80 -i -t ubuntu /bin/bash docker run -p 8080:80 -i -t ubuntu /bin/bash docker run -p 0.0.0.0::80 -i -t ubuntu /bin/bash docker run -p 0.0.0.0:8080:80 -i -t ubuntu /bin/bash |
容器中部署Nginx服务
准备环境:
1
2
3
4
5
6
7
8
|
# 1. 创建映射80端口的交互式容器 docker run -p 80 --name web -i -t ubuntu /bin/bash # 2. 更新源 apt- get update # 3. 安装Nginx apt- get install -y nginx # 4. 安装Vim apt- get install -y vim |
创建静态页面:
1
2
3
|
mkdir -p / var /www/html cd / var /www/html vim index.html |
修改Nginx配置文件:
1
2
3
4
|
# 查看Nginx安装位置 whereis nginx # 修改配置文件 vim /etc/nginx/sites-enabled/ default |
运行Nginx:
1
2
3
4
|
# 启动nginx nginx # 查看进程 ps -ef |
验证网站访问:
1
2
3
4
5
6
|
# 退出容器 Ctrl+P Ctrl+Q # 查看容器进程 docker top web # 查看容器端口映射情况 docker port web |
通过宿主机地址加映射端口访问:
VII. 镜像基操
查看删除镜像
列出镜像:docker images [OPTIONS] [REPOSITORY]
-a,–all=false,显示所有镜像
-f,–filter=[],显示时过滤条件
–no-trunc=false,指定不使用截断的形式显示数据
-q,–quiet=false,只显示镜像的唯一id
查看镜像:docker inspect [OPTIONS] CONTAINER|IMAGE [CONTAINER|IMAGE]
-f,–format=“”
删除镜像:docker rmi [OPTIONS] IMAGE [IMAGE]
-f,–force=false,强制删除镜像
–no-prune=false,保留未打标签的父镜像
虚悬镜像:既没有仓库名,也没有标签,均为
获取推送镜像
查找镜像:docker search [OPTIONS] TEAM
–automated=false,仅显示自动化构建的镜像
–no-trunc=false,不以截断的方式输出
–filter,添加过滤条件
拉取镜像:docker pull [OPTIONS] NAME [:TAG]
-a,–all-tags=false,下载所有的镜像(包含所有TAG)
推送镜像:docker push NAME [:TAG]
Docker允许上传我们自己构建的镜像,需要注册DockerHub的账户。
构建镜像
构建Docker镜像,可以保存对容器的修改,并且再次使用。构建镜像提供了自定义镜像的能力,以软件的形式打包并分发服务及其运行环境。Docker中提供了两种方式来构建镜像:
- 通过容器构建:docker commit
- 通过Dockerfile:docker build
使用commit命令构建镜像
命令:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
参数:-a,–author=“”,指定镜像的作者信息
-m,–message=“”,提交信息
-p,–pause=true,commit时是否暂停容器
使用Dockerfile文件构建镜像
Docker允许我们利用一个类似配置文件的形式来进行构建自定义镜像,在文件中可以指定原始的镜像,自定义镜像的维护人信息,对原始镜像采取的操作以及暴露的端口等信息。比如:
1
2
3
4
5
6
|
# Sample Dockerfile FROM ubuntu:16.04 MAINTAINER wgp "Kingdompin@163.com" RUN apt- get update RUN apt- get install -y nginx EXPOSE 80 |
命令:docker build [OPTIONS] DockerFile_PATH | URL | -
参数:–force-rm=false
–no-cache=false
–pull=false
-q,quite=false,构建时不输出信息
–rm=true
-t,tag=“”,指定输出的镜像名称信息
VIII. 镜像迁移
我们制作好的镜像,一般会迁移或分享给其他需要的人。Docker提供了几种将我们的镜像迁移、分享给其他人的方式。推荐镜像迁移应该直接使用Docker Registry,无论是直接使用Docker Hub还是使用内网私有Registry都可以。使用镜像频率不高,镜像数量不多的情况下,我们可以选择以下两种方式。
上传Docker Hub
首先,需要在Docker Hub上申请注册一个帐号(人机验证时需要科学上网)。然后我们需要创建仓库,指定仓库名称。
在终端中登录你的Docker Hub账户,输入docker login
,输入用户名密码即可登录成功。
查看需要上传的镜像,并将选择的镜像打上标签,标签名需和Docker Hub上新建的仓库名称一致,否则上传失败。给镜像打标签的命令如下。
1
|
docker tag <existing-image> <hub-user>/<repo-name>[:<tag>] |
其中existing-image
代表本地待上传的镜像名加tag,后面<hub-user>/<repo-name>[:<tag>]
则是为上传更改的标签名,tag不指定则为latest。
可以看到,我们重新为ubuntu:16.04的镜像打上标签,观察IMAGE ID可知,同一镜像可以拥有不同的标签名。接下来,我们利用push
命令直接上传镜像。
1
|
docker push <hub-user>/<repo-name>:<tag> |
如图,我们已经上传成功。由于之前介绍的分层存储系统,我们这里是直接对已有的ubuntu镜像进行上传,只是重新打了标签,所以真正上传的只是变化的部分。
导出文件互传
Docker 还提供了 docker load
和 docker save
命令,用以将镜像保存为一个tar文件。比如这次我们将ubuntu:latest这个镜像保存为tar文件。
查看本地磁盘,即可看见名为ubuntu18.04的tar包。我们可以将其拷贝给其他PC,利用load命令重新导入。