总览

  • 一、docker简介
  • 1.定义:
  • 2.组成:
  • 3.特点:
  • 二、安装docker
  • 1.环境
  • 2. 配置 Docker 的 apt 源
  • 2.1 安装包,允许 apt 命令 HTTPS 访问 Docker 源
  • 2.2 添加 Docker 官方的 GPG
  • 2.3 将 Docker 的源添加到 /etc/apt/sources.list
  • 2.4 安装Docker:
  • 2.5 免sudo配置
  • 2.6 检查 docker 安装
  • 2.7 运行第一个容器:
  • 三、Docker 基本操作
  • 3.1 运行镜像
  • 3.2 显示本地镜像库内容
  • 3.3 获得帮助
  • 3.4 显示运行中容器
  • 3.5 显示所有容器(包含已中止)
  • 3.6 继续运行原容器并进入
  • 3.7 Docker客户端常用指令总结:
  • 四、MySQL与容器化
  • 4.1 拉取MySQL 镜像
  • 4.2 远程仓库
  • 4.3 MySQL 容器构建文件 Dockerfile
  • 4.4 Dockerfile 常见指令(按指令出现顺序)
  • 4.5 构建docker镜像练习
  • 4.6 使用MySQL容器
  • 4.7 Docker compose 与多容器应用自动化部署
  • 五、Docker网络
  • 5.1 容器默认使用网络:
  • 5.2 容器支持网络与类型
  • 5.3 管理容器网络
  • 5.4 用户定义网络与bridge的区别?
  • 5.5 备制支持 ifconfig 和 ping 命令的 ubuntu 容器
  • 5.6 启动另一个命令窗口,由容器制作镜像
  • 5.7 Docker 默认网络
  • 5.8 创建自定义网络
  • 5.9 在两个窗口创建 u1,u2 容器网络
  • 六、Docker 仓库(Registry)
  • 6.1 容器仓库在 cncf 技术栈中属于供给层
  • 6.2 搭建私有容器仓库
  • 6.3 阿里云容器镜像服务(免费)实践
  • 七、容器监控与与日志
  • 7.1 检查docker的状态
  • 7.2 查看容器内进程
  • 7.3 容器详细信息
  • 7.4 容器日志查看
  • 八、docker图形化管理工具
  • 8.1 web图形化管理工具
  • 8.2 单节点运行
  • 8.3 Unix socket
  • 8.4 使用 Portainer


一、docker简介

1.定义:

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

2.组成:

  • dockerClient客户端
  • Docker Daemon守护进程
  • Docker Image镜像
  • DockerContainer容器

3.特点:

  • Fast, consistent delivery of your applications
  • Responsive deploymentand scaling
  • Running more workloads on the same hardware

二、安装docker

1.环境

Ubuntu 19.10

docker容器化部署流程 程序docker容器化_Docker

2. 配置 Docker 的 apt 源

2.1 安装包,允许 apt 命令 HTTPS 访问 Docker 源

执行如下命令:

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

docker容器化部署流程 程序docker容器化_Docker_02

2.2 添加 Docker 官方的 GPG

执行如下命令:

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

docker容器化部署流程 程序docker容器化_docker容器化部署流程_03

2.3 将 Docker 的源添加到 /etc/apt/sources.list

执行如下命令:

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

docker容器化部署流程 程序docker容器化_Docker_04

2.4 安装Docker:

执行如下命令:

sudo apt-get update
sudo apt-get install -y docker-ce

docker容器化部署流程 程序docker容器化_ubuntu_05


注:连接不上docker库解决办法:

手动加入源,执行如下命令:

cd /etc/apt/sources.list.d
sudo vi docker.list

加入以下信息:

deb https://download.docker.com/linux/ubuntu zesty edge

更新apt-get,并进行安装:

sudo apt update
sudo apt install docker-ce

docker容器化部署流程 程序docker容器化_docker容器化部署流程_06

2.5 免sudo配置

执行如下命令:

sudo addgroup --system docker
sudo adduser $USER docker
newgrp docker

docker容器化部署流程 程序docker容器化_docker_07

2.6 检查 docker 安装

执行如下命令:

docker version

docker容器化部署流程 程序docker容器化_docker_08

2.7 运行第一个容器:

执行如下命令:

docker run hello-world

docker容器化部署流程 程序docker容器化_mysql_09

三、Docker 基本操作

3.1 运行镜像

执行如下命令:

docker run -it ubuntu bash

docker容器化部署流程 程序docker容器化_docker容器化部署流程_10

3.2 显示本地镜像库内容

命令:

docker images

docker容器化部署流程 程序docker容器化_docker容器化部署流程_11

3.3 获得帮助

命令:

docker help

docker容器化部署流程 程序docker容器化_docker_12

3.4 显示运行中容器

命令:

docker ps

docker容器化部署流程 程序docker容器化_docker_13

3.5 显示所有容器(包含已中止)

命令:

docker ps -a

docker容器化部署流程 程序docker容器化_docker_14

3.6 继续运行原容器并进入

命令:

docker restart boring_shockley
docker ps
docker attach boring_shockley

docker容器化部署流程 程序docker容器化_docker容器化部署流程_15

3.7 Docker客户端常用指令总结:

指令

说明

docker images

列出镜像

docker search

搜索镜像

docker pull

拉取镜像

docker build

构建镜像

docker rmi

删除镜像

docker run

创建并启动容器

docker ps

列出容器

docker exec

执行容器

docker stop

停止容器

docker start

启动容器

docker rm

删除容器

四、MySQL与容器化

4.1 拉取MySQL 镜像

命令:

docker pull mysql:5.7
docker images

docker容器化部署流程 程序docker容器化_mysql_16

docker容器化部署流程 程序docker容器化_docker_17


注:

Repository: mysql

Tag: 5.7

Image ID: 1e4405fe1ea9

4.2 远程仓库

官方仓库: https://hub.docker.com/_/mysql/ 格式:https://registry/user/repo 仓库中保存若干版本镜像,每个镜像对应一个 tag
默认的 tag 是 lastest
每个镜像有 github 上 Dockfile 生成

4.3 MySQL 容器构建文件 Dockerfile

地址:https://github.com/docker-library/mysql/blob/master/5.7/Dockerfile

4.4 Dockerfile 常见指令(按指令出现顺序)
  • FROM base_image
  • RUN shell_commands
  • ENV env_vars
  • VOLUME path
  • COPY source destination
  • ENTRYPOINT [“executable”,”parm1”, ”parm2”,…]
  • EXPOSE ports
  • CMD [“executable”,”parm1”, ”parm2”,…]
    注:

指令

说明

FROM

指定基础镜像

MAINTAINER

指定镜像维护者信息

RUN

用于执行指定脚本命令

CMD

指定启动容器时执行的命令

EXPOSE

指定容器暴露的端口

ENV

指定环境变量

ADD

将文件从宿主机复制到容器指定位置,同时对压缩文件有自动解压功能

COPY

将文件从宿主机复制到容器指定位置

ENTRPOINT

设置容器启动时需要运行的命令

WORKDIR

为后续的如RUN、CMD、ENTRYPOINT、COPY、ADD指定工作目录

4.5 构建docker镜像练习

(1)创建dockerfile文件
命令:

mkdir mydock && cd mydock
gedit dockerfile

docker容器化部署流程 程序docker容器化_docker容器化部署流程_18


(2)编辑dockerfile文件:

输入以下内容:

FROM ubuntu
ENTRYPOINT ["top", "-b"]
CMD ["-c"]

(3)构建镜像:
命令:

sudo docker build . -t hello

docker容器化部署流程 程序docker容器化_docker容器化部署流程_19


(4)运行镜像

命令:

docker run -it --rm hello -H

docker容器化部署流程 程序docker容器化_docker_20

4.6 使用MySQL容器

(1)启动服务器
命令:

sudo docker run -p 3308:3306 --name mysql2 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7

docker容器化部署流程 程序docker容器化_docker_21


docker容器化部署流程 程序docker容器化_ubuntu_22


(2)启动 MySQL 客户端

命令:

docker run -it --net host mysql:5.7 "sh"
mysql -h127.0.0.1 -P3308 -uroot -proot

docker容器化部署流程 程序docker容器化_Docker_23


(3)数据库文件在哪里?

命令:

docker exec -it mysql2 bash
ls /var/lib/mysql

docker容器化部署流程 程序docker容器化_mysql_24


(4)Dockerfile 的 VOLUME /var/lib/mysql 的含义

命令:

docker container prune -f		//删除删除所有已经停止的容器
docker volume prune –f		//修剪卷
docker volume ls

docker容器化部署流程 程序docker容器化_mysql_25


注:每次启动 mysql 容器,docker 创建一个文件卷挂载在容器内/var/lib/mysql位置。这个卷在主机(host)的 /var/lib/docker/volumes/ 目录下

(5)创建卷并挂载

命令:

docker rm $(docker ps -a -q) -f -v
docker volume create mydb
docker run --name mysql2 -e MYSQL_ROOT_PASSWORD=root -v mydb:/var/lib/mysql -d mysql:5.7

docker容器化部署流程 程序docker容器化_docker_26


注:这里没有暴露端口到主机,将自己定义的数据卷挂载在 /var/lib/mysql

(6)启动客户端容器链接服务器

命令:

docker run --name myclient --link mysql2:mysql -it mysql:5.7 bash
mysql -hmysql -P3306 -uroot -proot

docker容器化部署流程 程序docker容器化_Docker_27


注:这里使用了 --link 连接两个容器,客户端容器内可以使用 mysql 这个别名访问服务器 。

(7)挂载现有数据库:

命令:

docker run -v "$PWD/data":/var/lib/mysql --user 1000:1000 --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

docker容器化部署流程 程序docker容器化_Docker_28

docker容器化部署流程 程序docker容器化_Docker_29


(8)修改容器配置

命令:

docker run --name some-mysql -v /my/custom:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

docker容器化部署流程 程序docker容器化_docker_30

4.7 Docker compose 与多容器应用自动化部署

(1)下载docker-compose(容器编排的原型)
命令:

sudo apt install docker-compose

(2)编写:stack.yml
命令:

mkdir comptest && cd comptest
 gedit stack.yml

内容:

version: '3.1'
services:
  db:
    image: mysql:5.7
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: example
  adminer:
    image: adminer
    restart: always
    ports:
      - 8080:8080

(3)启动服务:
命令:

docker-compose -f stack.yml up

docker容器化部署流程 程序docker容器化_ubuntu_31


docker容器化部署流程 程序docker容器化_mysql_32

五、Docker网络

5.1 容器默认使用网络:

Docker0(桥接)

5.2 容器支持网络与类型
  • bridge (本机内网络)
  • host (主机网卡)
  • overlay (跨主机网络)
  • none
  • Custom(网络插件)
5.3 管理容器网络

命令:

docker network ls

docker容器化部署流程 程序docker容器化_docker_33

5.4 用户定义网络与bridge的区别?
  • 灵活的构建容器之间的通讯网络
  • 自定义网络自带 DNS
    – 同一自定义网络上的容器,可以通过容器名访问
    – Bridge 网络上容器只能通过 IP 访问
  • 遗留的做法:
    –使用 link 将被访问容器的域名和环境变量导入容器
  • 容器与自定义网络之间
    – 自由地连接或断开
  • 通过配置 iptable 配置网桥
5.5 备制支持 ifconfig 和 ping 命令的 ubuntu 容器

命令:

~]# docker run --name unet -it --rm ubuntu bash
root@48a255a95c37:/# apt-get update
…
root@48a255a95c37:/# apt-get install net-tools
root@48a255a95c37:/# apt-get install iputils-ping -y
root@48a255a95c37:/# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.2  netmask 255.255.0.0  broadcast 0.0.0.0
…
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
…
root@48a255a95c37:/# ping <your host ip>
…

docker容器化部署流程 程序docker容器化_ubuntu_34


docker容器化部署流程 程序docker容器化_ubuntu_35


docker容器化部署流程 程序docker容器化_mysql_36

5.6 启动另一个命令窗口,由容器制作镜像

命令:

docker commit unet ubuntu:net

docker容器化部署流程 程序docker容器化_docker容器化部署流程_37

5.7 Docker 默认网络
  • 容器通过桥(docker0)相连
  • IP-Forward通过NAT访问外面
  • 端口映射使外面访问容器
5.8 创建自定义网络

命令:

docker network create mynet

docker容器化部署流程 程序docker容器化_mysql_38

5.9 在两个窗口创建 u1,u2 容器网络

使用以下命令:

docker run --name u1 -it -p 8080:80 --net mynet --rm ubuntu:net bash
docker run --name u2 --net mynet -it --rm ubuntu:net bash
docker info u1
docker network connect bridge u1
docker network disconnect mynet u1

docker容器化部署流程 程序docker容器化_ubuntu_39


docker容器化部署流程 程序docker容器化_docker_40


注:docker info : 显示 Docker 系统信息,包括镜像和容器数。

docker容器化部署流程 程序docker容器化_mysql_41


没有docker info u1这样的命令。

六、Docker 仓库(Registry)

6.1 容器仓库在 cncf 技术栈中属于供给层

(1)公共容器仓库服务

  • Docker hub https://hub.docker.com/
  • Amazon ECR
  • … …
  • 几乎所有容器云服务商都免费提供此服务!

(2)私有容器仓库工具

  • Docker Registry 2
  • Vmware Harbor
  • Sonatype Nexus 3
6.2 搭建私有容器仓库

(1)官方指南:
https://docker.github.io/registry/deploying/ 仅需要实验到 Stop a local registry

  1. start the registry container
    命令:
docker run -d -p 5000:5000 --restart=always --name registry registry:2

docker容器化部署流程 程序docker容器化_docker容器化部署流程_42

  1. Copy an image from Docker Hub to your registry
    命令:
docker pull ubuntu:16.04		//Pull the ubuntu:16.04 image from Docker Hub.
docker tag ubuntu:16.04 localhost:5000/my-ubuntu			//Tag the image as localhost:5000/my-ubuntu.
docker push localhost:5000/my-ubuntu		//Push the image to the local registry running at localhost:5000:
docker image remove ubuntu:16.04			
docker image remove localhost:5000/my-ubuntu		//Remove the locally-cached ubuntu:16.04 and localhost:5000/my-ubuntu images
docker pull localhost:5000/my-ubuntu		//Pull the localhost:5000/my-ubuntu image from your local registry.

docker容器化部署流程 程序docker容器化_docker容器化部署流程_43


docker容器化部署流程 程序docker容器化_docker_44


docker容器化部署流程 程序docker容器化_ubuntu_45


3. Stop a local registry

  • To stop the registry, use the same docker container stop command as with any other container.
    命令:
docker container stop registry
  • To remove the container, use docker container rm.
    命令:
docker container stop registry && docker container rm -v registry

docker容器化部署流程 程序docker容器化_Docker_46


(2)Docker Registry 开源代码:https://github.com/docker/distribution

6.3 阿里云容器镜像服务(免费)实践

(1)访问 https://cr.console.aliyun.com (2)用淘宝或注册一个账号

docker容器化部署流程 程序docker容器化_docker容器化部署流程_47


(3)选择“容器镜像服务”

docker容器化部署流程 程序docker容器化_ubuntu_48


(4)进行常用仓库操作:如上传 hello-world 镜像

  • 登陆 docker login --username= registry.cn-shenzhen.aliyuncs.com
  • 标签 docker tag hello-world registry.cn-shenzhen.aliyuncs.com/pmlpml/repo:hello-world
  • 上传 docker push registry.cn-shenzhen.aliyuncs.com/pmlpml/repo:hello-world
  • 下载 docker pull registry.cn-shenzhen.aliyuncs.com/pmlpml/repo:hello-world
  • 标签 docker tag registry.cn-shenzhen.aliyuncs.com/pmlpml/repo:hello-world hello-world
  • 删除 docker rmi registry.cn-shenzhen.aliyuncs.com/pmlpml/repo:hello-world
  • 运行 docker run --rm hello-world
  • 退出 docker logout registry.cn-shenzhen.aliyuncs.com

七、容器监控与与日志

7.1 检查docker的状态

命令:

docker info 
docker info --format {{.ServerVersion}}

docker容器化部署流程 程序docker容器化_docker容器化部署流程_49

7.2 查看容器内进程

命令:

docker top
docker stats

docker容器化部署流程 程序docker容器化_ubuntu_50


docker容器化部署流程 程序docker容器化_Docker_51


注:docker top :查看容器中运行的进程信息,支持 ps 命令参数。

docker stats:Display a live stream of container(s) resource usage statistics

7.3 容器详细信息

命令:

docker inspect
docker inspect -f '{{.NetworkSettings.IPAddress}}' 084f46eddf33

docker容器化部署流程 程序docker容器化_docker容器化部署流程_52


注:

docker容器化部署流程 程序docker容器化_docker_53

7.4 容器日志查看

命令:

docker logs

注:

docker容器化部署流程 程序docker容器化_Docker_54


测试:

docker容器化部署流程 程序docker容器化_ubuntu_55

八、docker图形化管理工具

8.1 web图形化管理工具

Portainer

8.2 单节点运行

命令:

sudo docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer

docker容器化部署流程 程序docker容器化_ubuntu_56


docker容器化部署流程 程序docker容器化_mysql_57

8.3 Unix socket

8.4 使用 Portainer