Ubuntu16.04环境下Docker搭建与使用

  • 一.Docker架构
  • Docker核心组件
  • 二.Docker安装
  • 三.Docker常用命令
  • 四.Dockerfile详解
  • 五.Dockerfile常用指令
  • 六.Systemd指令


一.Docker架构

Docker 采用的是 Client/Server 架构。客户端向服务器发送请求,服务器负责构建、运行和分发容器。客户端和服务器可以运行在同一个 Host 上,客户端也可以通过 socket 或 REST API 与远程的服务器通信。

Docker核心组件

1、Docker Client:Docker客户端是 Docker 提供命令行界面 (CLI) 工具,是许多 Docker 用户与 Docker 进行交互的主要方式。客户端可以构建,运行和停止应用程序,还可以远程与Docker_Host进行交互。相当于Docker命令
2、Docker daemon:服务器组件是 Docker 最核心的后台进程,我们也把它称为守护进程。负责响应来自 Docker Client 的请求,然后将这些请求翻译成系统调用完成容器管理操作。该进程会在后台启动一个 API Server ,负责接收由 Docker Client 发送的请求,接收到的请求将通过Docker daemon 内部的一个路由分发调度,由具体的函数来执行请求。
(1) Docker Server:接受Docker Client请求
(2) Engine:处理请求
(3) Job:根据请求类型创建相应Job
启动Daemon:docker --daemon = true或docker –d或docker –d = true
Docker daemon 只能响应来自本地 Host 的客户端请求。如果要允许远程客户端请求,需要在配置文件中打开 TCP 监听。
(1) 编辑配置文件 /etc/systemd/system/multi-user.target.wants/docker.service ,在环境变量 ExecStart后面添加 -H tcp://0.0.0.0,允许来自任意 IP 的客户端连接。
(2) 重启 Docker daemon:systemctl daemon-reload或systemctl restart docker.service
(3) 通过以下命令即可实现与远程服务器通信:docker -H 服务器IP地址 info
3、Docker Image:Docker可以看做一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。只读模板,通过镜像创建Docker容器。
4、Docker Registry:存储 docker image 的仓库,执行push,pull,search等操作
5、Docker Container:Docker 容器就是 Docker 镜像的运行实例,是真正运行项目程序、消耗系统资源、提供服务的地方。用run提供服务

二.Docker安装

更新apt包索引:

sudo apt-get update

安装以下包以使apt可以通过HTTPS使用存储库(repository):

sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common

添加Docker官方的GPG密钥:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add –

使用下面的命令来设置stable存储库:

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

再更新一下apt包索引:

sudo apt-get update

安装最新版本的Docker CE:

sudo apt-get install -y docker-ce

查看docker版本以及是否安装完成:

dockerhub客户端下载 docker 客户端_Dockerfile

查看docker服务是否启动:

systemctl status docker

dockerhub客户端下载 docker 客户端_Dockerfile_02

若未启动,则启动docker服务:

sudo systemctl start docker

经典的hello world:

sudo docker run hello-world

具体的实现步骤:

(1) Docker 客户端执行 docker run 命令

(2) Docker daemon 发现本地没有 hello-world 镜像

(3) daemon 从 Docker Hub 下载镜像

(4) 下载完成,镜像 hello-world 被保存到本地

(5) Docker daemon 启动容器

dockerhub客户端下载 docker 客户端_Docker_03

三.Docker常用命令

1、 需要拉取一个 docker 镜像:docker pull image_name
下载完成后,该镜像被默认保存到 /var/lib/docker 目录下。
2、 查看下主机下存在多少镜像,我们可以用如下命令:docker images
3、 知道当前有哪些容器在运行,我们可以用如下命令:docker ps -a
-a 是查看当前所有的容器,包括未运行的
4、 对容器进行启动,重启和停止:

docker start container_name/container_id
docker restart container_name/container_id
docker stop container_name/container_id

5、 进入某个容器中:

docker attach container_name/container_id

6、 运行这个容器中的镜像,并且调用镜像里面的 bash:

docker run -t -i container_name/container_id /bin/bash

7、 删除容器:

docker rm container_name/container_id

8、 删除镜像:

docker rmi image_name

9、 后台运行容器:

docker run -d container_name/container_id

dockerhub客户端下载 docker 客户端_dockerhub客户端下载_04


10、端口映射:

docke run -d -p 8080(主机端口):80(容器端口) container_name/container_id

11、随机端口映射:

docke run -d -P  container_name/container_id

Docke网络

1、 网络累计:Bridge(校接),Host,None

2、 端口映射:将主机端口和容器端口通过网桥映射

dockerhub客户端下载 docker 客户端_Docker_05

四.Dockerfile详解

Dockerfile 是自动构建 docker 镜像的配置文件, 用户可以使用 Dockerfile 快速创建自定义的镜像。Dockerfile 中的命令非常类似于 linux 下的 shell 命令。
1、 基础镜像(父镜像)信息指令 FROM:FROM 是用于指定基础的 images ,一般格式为 FROM <image> or FORM <image>:<tag> 2、 维护者信息指令 MAINTAINER:用于指定镜像创建者和联系方式,一般格式为MAINTAINER <name> 3、 镜像操作指令 RUN 、 EVN 、 ADD 和 WORKDIR 等:
4、 容器启动指令 CMD 、 ENTRYPOINT 和 USER 等
5、 例子:

FROM python:2.7
MAINTAINER Angel_Kitty <angelkitty6698@gmail.com>
COPY . /app
WORKDIR /app
RUN pip install -r requirements.txt
EXPOSE 5000
ENTRYPOINT ["python"]
CMD ["app.py"]

(1) 从 Docker Hub 上 pull 下 python 2.7 的基础镜像
(2) 显示维护者的信息
(3) copy 当前目录到容器中的 /app 目录下 复制本地主机的 ( Dockerfile 所在目录的相对路径)到容器里
(4) 指定工作路径为 /app
(5) 安装依赖包
(6) 暴露 5000 端口
(7) 启动 app

五.Dockerfile常用指令

1、 FROM:用于指定基础的 images ,一般格式为 FROM <image> or FORM <image>:<tag>,所有的 Dockerfile 都用该以 FROM 开头,FROM 命令指明 Dockerfile 所创建的镜像文件以什么镜像为基础,FROM 以后的所有指令都会在 FROM 的基础上进行创建镜像。
2、 MAINTAINER:用于指定镜像创建者和联系方式,一般格式为 MAINTAINER <name>
3、 COPY:用于复制本地主机的 (为 Dockerfile 所在目录的相对路径)到容器中的 。当使用本地目录为源目录时,推荐使用 COPY 。一般格式为 COPY <src><dest>
4、 WORKDIR:用于配合 RUN,CMD,ENTRYPOINT 命令设置当前工作路径。可以设置多次,如果是相对路径,则相对前一个 WORKDIR 命令。默认路径为/。一般格式为WORKDIR /path/to/work/dir
5、 RUN:用于容器内部执行命令。每个 RUN 命令相当于在原有的镜像基础上添加了一个改动层,原有的镜像不会有变化。一般格式为 RUN <command>
6、 EXPOSE:用来指定对外开放的端口。一般格式为 EXPOSE <port> [<port>...] 7、 ENTRYPOINT:让容器表现得像一个可执行程序一样。一个 Dockerfile 中只能有一个 ENTRYPOINT,如果有多个,则最后一个生效。
ENTRYPOINT 命令也有两种格式:
ENTRYPOINT ["executable", "param1", "param2"]:推荐使用的 exec形式
ENTRYPOINT command param1 param2:shell 形式
8、 CMD:用于启动容器时默认执行的命令,CMD 命令可以包含可执行文件,也可以不包含可执行文件。不包含可执行文件的情况下就要用 ENTRYPOINT 指定一个,然后 CMD 命令的参数就会作为ENTRYPOINT的参数。
CMD 命令有三种格式:
CMD ["executable","param1","param2"]:推荐使用的 exec 形式。
CMD ["param1","param2"]:无可执行程序形式
CMD command param1 param2:shell 形式。
一个 Dockerfile 中只能有一个CMD,如果有多个,则最后一个生效。

构建Dockerfile
(1) 写Dockerfile文件
(2) 搭建镜像到仓库:
在 Dockerfile 文件所在目录执行:docker build -t angelkitty/nginx_web:v1 .
-t 是为新镜像设置仓库和名称,其中 angelkitty 为仓库名, nginx_web 为镜像名, :v1为标签(不添加为默认 latest )
(3) 使用 docker run 命令来启动容器
docker run --name nginx_web -d -p 8080:80 angelkitty/nginx_web:v1
用 nginx 镜像启动一个容器,命名为 nginx_web ,并且映射了 8080 端口,这样我们可以用浏览器去访问这个 nginx 服务器:http://localhost:8080/ 或者 http://本机的IP地址:8080/

六.Systemd指令

systemd 是 Linux 下的一款系统和服务管理器,兼容 SysV 和 LSB 的启动脚本。该命令可用于查看系统状态和管理系统及服务。
查看系统状态:

systemctl status

输出激活的单元:

systemctl

输出执行失败的单元:

systemctl –failed

查看全部已安装服务:

systemctl list-unit-files

马上激活单元:

systemctl start <单元>

马上停止单元:

systemctl stop <单元>

重新启动单元:

systemctl restart <单元>

又一次载入配置:

systemctl reload <单元>

输出单元执行状态:

systemctl status <单元>

检查单元是否配置为自己主动启动:

systemctl is-enabled <单元>

开机自己主动激活单元:

systemctl enable <单元>

取消开机自己主动激活单元:

systemctl disable <单元>

禁用一个单元(禁用后,间接启动也是不可能的):

systemctl mask <单元>

取消禁用一个单元:

systemctl unmask <单元>