总览
- 一、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
2. 配置 Docker 的 apt 源
2.1 安装包,允许 apt 命令 HTTPS 访问 Docker 源
执行如下命令:
sudo apt-get install \apt-transport-https \ca-certificates \curl \software-properties-common
2.2 添加 Docker 官方的 GPG
执行如下命令:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
2.3 将 Docker 的源添加到 /etc/apt/sources.list
执行如下命令:
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
2.4 安装Docker:
执行如下命令:
sudo apt-get update
sudo apt-get install -y docker-ce
注:连接不上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
2.5 免sudo配置
执行如下命令:
sudo addgroup --system docker
sudo adduser $USER docker
newgrp docker
2.6 检查 docker 安装
执行如下命令:
docker version
2.7 运行第一个容器:
执行如下命令:
docker run hello-world
三、Docker 基本操作
3.1 运行镜像
执行如下命令:
docker run -it ubuntu bash
3.2 显示本地镜像库内容
命令:
docker images
3.3 获得帮助
命令:
docker help
3.4 显示运行中容器
命令:
docker ps
3.5 显示所有容器(包含已中止)
命令:
docker ps -a
3.6 继续运行原容器并进入
命令:
docker restart boring_shockley
docker ps
docker attach boring_shockley
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
注:
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
(2)编辑dockerfile文件:
输入以下内容:
FROM ubuntu
ENTRYPOINT ["top", "-b"]
CMD ["-c"]
(3)构建镜像:
命令:
sudo docker build . -t hello
(4)运行镜像
命令:
docker run -it --rm hello -H
4.6 使用MySQL容器
(1)启动服务器
命令:
sudo docker run -p 3308:3306 --name mysql2 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
(2)启动 MySQL 客户端
命令:
docker run -it --net host mysql:5.7 "sh"
mysql -h127.0.0.1 -P3308 -uroot -proot
(3)数据库文件在哪里?
命令:
docker exec -it mysql2 bash
ls /var/lib/mysql
(4)Dockerfile 的 VOLUME /var/lib/mysql 的含义
命令:
docker container prune -f //删除删除所有已经停止的容器
docker volume prune –f //修剪卷
docker volume ls
注:每次启动 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
注:这里没有暴露端口到主机,将自己定义的数据卷挂载在 /var/lib/mysql
(6)启动客户端容器链接服务器
命令:
docker run --name myclient --link mysql2:mysql -it mysql:5.7 bash
mysql -hmysql -P3306 -uroot -proot
注:这里使用了 --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
(8)修改容器配置
命令:
docker run --name some-mysql -v /my/custom:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
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网络
5.1 容器默认使用网络:
Docker0(桥接)
5.2 容器支持网络与类型
- bridge (本机内网络)
- host (主机网卡)
- overlay (跨主机网络)
- none
- Custom(网络插件)
5.3 管理容器网络
命令:
docker network ls
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>
…
5.6 启动另一个命令窗口,由容器制作镜像
命令:
docker commit unet ubuntu:net
5.7 Docker 默认网络
- 容器通过桥(docker0)相连
- IP-Forward通过NAT访问外面
- 端口映射使外面访问容器
5.8 创建自定义网络
命令:
docker network create mynet
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 info : 显示 Docker 系统信息,包括镜像和容器数。
没有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
- start the registry container
命令:
docker run -d -p 5000:5000 --restart=always --name registry registry:2
- 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.
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
(2)Docker Registry 开源代码:https://github.com/docker/distribution
6.3 阿里云容器镜像服务(免费)实践
(1)访问 https://cr.console.aliyun.com (2)用淘宝或注册一个账号
(3)选择“容器镜像服务”
(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}}
7.2 查看容器内进程
命令:
docker top
docker stats
注: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
注:
7.4 容器日志查看
命令:
docker logs
注:
测试:
八、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
8.3 Unix socket
8.4 使用 Portainer
- Github: https://github.com/portainer/portainer
- 详细部署: https://portainer.readthedocs.io/en/latest/deployment.html