文章目录
- sc-hw11 容器化技术与容器服务
- 实验环境
- 部署docker环境
- docker 基本操作
- MySQL与容器化
- 部署MySQL
- 构建 docker 镜像练习
- 使用 MySQL 容器
- 创建卷并挂载
- 启动客户端容器链接服务器
- Docker compose 与多容器应用自动化部署
- Docker网络
- 管理容器网络
- 备制支持 ifconfig 和 ping 命令的 ubuntu 容器
- 启动另一个命令窗口,由容器制作镜像
- 创建自定义网络
- Docker 仓库
- 搭建私有容器仓库
- 阿里云容器镜像服务(免费)实践
- 常用仓库操作
- 容器监控与日志
- docker图形化管理工具
- Docker Engine API与开发
- 用 curl 发 docker 客户端命令
sc-hw11 容器化技术与容器服务
实验环境
Ubuntu 18.04部署docker环境
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
首先保险起见,尝试清理一下系统中的 Docker 旧组件或版本:
sudo apt-get remove docker docker-engine containerd runc尝试更新一下软件源索引:
sudo apt-get update安装一些系统依赖组建:
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common添加 Docker 官方的公钥:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -这一步如果失败并提示以下错误信息:

这是由于GitHub release文件被墙导致下载失败了。解决办法:
百度ipaddress,查找被墙网址的ip:

然后 vi /etc/hosts命令在 hosts文件末尾中加入以下内容:
52.216.107.188 github-com.s3.amazonaws.com重新执行上述添加公钥的命令即可成功。
验证一下公钥,输出应该为: 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
sudo apt-key fingerprint 0EBFCD88添加 Docker 官方的软件源:
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"再次更新软件源索引:
sudo apt-get update可以开始安装 Docker,执行命令后等待就可以:
sudo apt-get install docker-ce docker-ce-cli containerd.io如果你不是root用户,请将用户加入docker用户组:
sudo usermod -aG docker $(whoami)重启虚拟机即可生效。
最后就是安装 docker-composer 辅助命令了,如果项目要使用到多个 docker 容器,那它就是你的福音,安装方式有点特殊,也很简单,就是直接下载文件,放入系统命令目录,赋予执行权限就可以了:
sudo curl -L "https:///docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-composedocker 基本操作
检查docker的安装
docker version
运行第一个容器
docker run hello-world
docker run -it ubuntu bash
-it参数:通过终端与进程(容器)交互,stdin,stdout,stderr定向到 TTY
如果没有-it参数,执行上述命令无法为容器分配伪输入终端,无法开启交互模式。
显示本地镜像内容:
docker images
显示运行中容器:
docker ps
显示所有容器(包括已中止):
docker ps -a
MySQL与容器化
部署MySQL
拉取MySQL镜像:
这一步比较曲折,试了好几种办法都失败了,记录一下没能成功的尝试过程。
直接拉取:
docker pull mysql:5.7结果:连接失败,提示TLS hand handshake timeout。
在docker文件夹下配置daemon.json, 修改docker的registry-mirrors:
{"registry-mirrors": ["http://"]}或
{"registry-mirrors": ["http://4e70ba5d.m."]}然后service restart docker重启服务器
结果:可以下载,一开始速度挺快,然后越来越慢,到最后直接卡住。
最后一种办法拉取成功了:通过国内镜像/library库下载
docker pull /library/mysql:5.7

构建 docker 镜像练习
~] mkdir mydock && cd mydock
mydock]# vi dockerfile录入一下内容:
FROM ubuntu
ENTRYPOINT ["top", "-b"]
CMD ["-c"]构建镜像:
docker build . -t hello
查看构建的镜像:
docker images hello
运行镜像:
docker run -it --rm hello -H
使用 MySQL 容器
启动服务器:
sudo docker run -p 3306:3306 --name mysql2 -e MYSQL_ROOT_PASSWORD=root -d /library/mysql:5.7
docker ps
启动 MySQL 客户端:
docker run -it --net host /library/mysql:5.7 "sh"
mysql -h127.0.0.1 -P3306 -uroot -proot
创建卷并挂载
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 /library/mysql:5.7


上述命令的作用就是将自己定义的数据卷挂载到 /var/lib/mysql 上。
启动客户端容器链接服务器
docker run --name myclient --link mysql2:mysql -it mysql:5.7 bash
env
mysql -hmysql -P3306 -uroot -proot
Docker compose 与多容器应用自动化部署
下载 Docker-compose 已经在部署 docker 时完成
Docker网络
管理容器网络
docker network ls
备制支持 ifconfig 和 ping 命令的 ubuntu 容器
docker run --name unet -it --rm ubuntu bash
apt-get update
apt-get install iputils-ping -y
ifconfig
ping <your host ip>
启动另一个命令窗口,由容器制作镜像
docker commit unet ubuntu:net
创建自定义网络
创建 mynet:
docker network create mynet在两个窗口创建 u1,u2 容器网络:
docker network create u1docker network create 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 bashu1 ,u2 两个容器网络之间互相ping(u1 的 IP 是 172.21.0.2, u2 的 IP是172.21.0.3):


u1 / u2 ping 外部网络,如百度:

从结果可以看到,容器网络是可以连通外部网络的。
执行以下命令:
docker inspect u1
docker network connect bridge u1
docker network disconnect mynet u1然后重新ping:


u1, u2之间无法ping通了,但依然可以ping通外部网络。
Docker 仓库
搭建私有容器仓库
运行一个本地仓库:
docker run -d -p 5000:5000 --restart=always --name registry registry:2
从 Docker Hub 拉取镜像 ubuntu:16.04:
docker pull ubuntu:16.04
标记镜像:
docker tag ubuntu:16.04 localhost:5000/my-ubuntu当标记的第一部分是主机名和端口时,Docker 在推送时将其解释为仓库的位置。
推送镜像到本地仓库:
docker push localhost:5000/my-ubuntu
删除本地缓存和镜像:
docker image remove ubuntu:16.04
docker image remove localhost:5000/my-ubuntu
之后可以从仓库中拉取镜像。
从仓库中拉取镜像:
docker pull localhost:5000/my-ubuntu
停止并删除本地仓库:
docker container stop registry && docker container rm -v registry
阿里云容器镜像服务(免费)实践
访问https://cr.console.aliyun.com/。
用淘宝或注册一个账号。
选择“容器镜像服务”。
常用仓库操作
登录:
docker login --username=<your account> 
标签:
docker tag hello-world /beikenken/hello-world上传:
docker push /beikenken/hello-world
运行:
docker run --rm hello-world
退出:
docker logout 
容器监控与日志
检查 docker 的状态:
docker info

docker info --format {{.ServerVersion}}
查看容器内进程:
docker top
容器详细信息:
docker inspect
docker inspect -f '{{.NetworkSettings.IPAddress}}' 084f46eddf33
容器日志查看:
docker logs
ll
docker图形化管理工具
Portainer是一个可视化的容器镜像的图形管理工具,利用Portainer可以轻松构建,管理和维护Docker环境。 而且完全免费,基于容器化的安装方式,方便高效部署。
部署 portainer :
docker pull portainer/portainer
选择 aliyun 的镜像源很快。
docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer
访问9000端口可以查看图形化界面:


Docker Engine API与开发
用 curl 发 docker 客户端命令
docker pull alpine
sudo curl --unix-socket /var/run/docker.sock -H "Content-Type: application/json" \
-d '{"Image": "alpine", "Cmd": ["echo", "hello world"]}' \
-X POST http://localhost/v1.41/containers/create
sudo curl --unix-socket /var/run/docker.sock -X POST http://localhost/v1.41/containers/8ddb074cfada0fdffaee4ffbee9131bedf625b1e6d789f0e438106e7af96555c/start
sudo curl --unix-socket /var/run/docker.sock -X POST http://localhost/v1.41/containers/8ddb074cfada0fdffaee4ffbee9131bedf625b1e6d789f0e438106e7af96555c/wait
curl --unix-socket /var/run/docker.sock -o - "http://localhost/v1.41/containers/8ddb074cfada0fdffaee4ffbee9131bedf625b1e6d789f0e438106e7af96555c/logs?stdout=1"
















