容器化技术与容器服务实践报告
体验docker容器
文章目录
基础操作
查看docker的版本
sudo docker version
运行镜像
运行镜像且与容器进行交互
显示本地镜像库
sudo docker images
获取帮助
sudo docker --help
包含基本选项、管理命令、常用命令
显示所有容器
sudo docker ps -a
继续运行原容器并进入
继续运行
sudo docker restart 名字/容器ID
进入容器
sudo docker attach 名字/容器ID
容器ID支持缩写,如下图所示容器76c2a11af2d5在指令中以76c表示
dockerfile简单介绍
FROM:定制的镜像都是基于 FROM 的镜像
FROM golang:1.15.3 as build
RUN:用于执行后面跟着的命令行命令。
RUN go build .
COPY:复制指令,从上下文目录中复制文件或者目录到容器里指定路径。
ADD:ADD 指令和 COPY 的使用格式一致(同样需求下,官方推荐使用 COPY)。功能也类似
ADD . $GOPATH/src/server
CMD:类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:
- CMD 在docker run 时运行。
- RUN 是在 docker build。
ENTRYPOINT:类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。
ENTRYPOINT ["./server"]
ENV:设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。
ENV GO111MODULE=on
ENV GOPROXY=https://goproxy.cn,direct
VOLUME:定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。
EXPOSE:仅仅只是声明端口。
WORKDIR:指定工作目录。
WORKDIR $GOPATH/src/server
MySQL与容器化
拉取MySQL镜像
sudo docker pull mysql:5.7
注意:我之前已经pull过一遍了,所以大量显示Already exists
,但可以注意到命令也会自动访问云端然后更新本地版本,如下图所示;
通过dockerfile构建docker镜像
FROM ubuntu
ENTRYPOINT ["top", "-b"]
CMD ["-c"]
sudo docker build . -t hello
- 运行该镜像
使用MySQL容器
sudo docker run -p 3306:3306 --name mysql2 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
启动MySQL客户端
查看数据库文件
操作VOLUME
创建卷并挂载
启动客户端容器
(注意这里使用了–link,所以不暴露接口,而在后面使用容器别名来访问MySQL服务器)
客户端链接服务器
Docker compose
安装
sudo apt install docker-compose
注意:安装后docker damon无法启动,由于该问题无法复现,无法肯定原因是什么,但是重启电脑后docker就可以正常运行了,故怀疑与docker-compose相关;
编写.yml
version: '3.1'
services:
db:
image: mysql:5.7
command: --default-authentication-plugin=mysql_native_password
restart: always
environment: MYSQL_ROOT_PASSWORD: example
运行
docker-compose -f stack.yml up
报错
ERROR: yaml.scanner.ScannerError: mapping values are not allowed here in "./stack.yml", line 2, column 9
查阅发现: .yml要求每个冒号 和每个 - 符号后面必须有一个空格
且不允许\t
修改后重新运行
成功!
Docker网络
备制支持 ifconfig 和 ping 命令的 ubuntu 容器
sudo docker run --name unet -it --rm ubuntu bash
sudo docker commit unet ubuntu:net
sudo docker inspect xxx
阿里云容器镜像服务
尝试上传
成功!
基本指令汇总
登录
sudo docker login --username=nonolizh registry.cn-shenzhen.aliyuncs.com
拉取
sudo docker pull registry.cn-shenzhen.aliyuncs.com/nonoli/qt-sc-server:[镜像版本号]
推送
$ sudo docker login --username=nonolizh registry.cn-shenzhen.aliyuncs.com
$ sudo docker tag [ImageId] registry.cn-shenzhen.aliyuncs.com/nonoli/qt-sc-server:[镜像版本号]
$ sudo docker push registry.cn-shenzhen.aliyuncs.com/nonoli/qt-sc-server:[镜像版本号]
容器监控与日志
附录1:修改docker中的MySQL的编码
新建mysqld.cnf
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
#log-error = /var/log/mysql/error.log
# By default we only accept connections from localhost
#bind-address = 127.0.0.1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
character_set_server=utf8
init_connect='SET NAMES utf8'
max_allowed_packet = 20M
[mysql]
default-character-set = utf8
[mysql.server]
default-character-set = utf8
[mysqld_safe]
default-character-set = utf8
[client]
default-character-set = utf8
将该文件复制到docker中的指定位置
sudo docker cp /usr/soft/mysqld.cnf mysql:/etc/mysql/mysql.conf.d/
重启容器
sudo docker restart xxx
可以注意到MySQL的编码成功改为utf8
附录2:docker访问宿主机网络
问题:docker虽然默认在同一个网络中(见上文的docker网络),但本地的golang程序代码中都是写localhost的,而部署在docker后它们有不同的IP,不再能使用localhost;
解决1:将localhost改为IP地址,即修改代码;
解决2:
docker run -d --network host xxxx
直接让容器与宿主机共享网络,然后让其它容器使用-p
来暴露端口,容器中的localhost就能访问这些暴露端口,保证程序成功运行;