容器化入门(二)--docker实战
1.镜像仓Regisry:镜像仓就好比是应用商店或者GitHub, 里面归档了很多镜像。我们可以从上面方便的下载镜像,也可以把自己的镜像归档&分享到上面
2.DockerHub:这是Docker公司官方搭建的官方Registry服务,世界上最大的镜像仓,和GitHub一样几乎称为了容器世界的基础设施,任何人都可以上传自己的镜像,当然这也导致上面的镜像仓“良莠不齐”
3.如何在DockerHub上挑选镜像:
官方镜像:证明镜像经过了Docker官方认证,有一个特殊的标记“Official image” 认证镜像:都是颇具规模的大公司发布的,标识“Verified publisher”
优选官方镜像和认证镜像,同时关注下载量和更新历史,“随大流”是最保险的
在下载镜像时,如果下载的是非官网的镜像,要把用户名也带上,用户名/应用名
的形式
docker pull bitnami/nginx
4.一些Docker Hub上镜像命名的规则:知道了镜像名称还不够,因为镜像还有不同的版本,也就是标签。一般版本的命名有一些规则:
通用的版本号: 主版本号.次版本号.补丁号
,例如6.2.6
rc代表正式发布前的候选版本 release candidata
Ubuntu和Debian使用代号的形式,例如 bionic
是Ubuntu 18.04,focal
是Ubuntu 20.04,有的标签还会加上 slim
--精简包,fat
--包含了较多辅助工具
5.在Docker Hub上传自己的镜像包:
在DockerHub注册账号 在本机上登录 docker login -u
如果在build镜像时没有带上 -t
参数设置tag,需要先给镜像设置tag,tag一定要带上用户名docker tag ngx-app zhangsan/ngx-app:1.0
推送 docker push zhangsan/ngx-app:1.0
6.如何在离线环境管理镜像:企业的产品,可能无法连接Docker Hub,那么如何管理、下载镜像呢?
方法1:在内网环境搭建自己的Registry,非常简单,后面马上时间 方法2:可以使用 docker save
和docker load
将镜像打包成tar包、或者从tar包加载镜像
docker save ngx-app:latest -o ngx.tar
docker load -i ngx.tar
7.拷贝容器内的数据:使用docker cp
命令可以在容器和宿主机之间拷贝文件,也可以直接拷贝文件夹(不需要-r参数)。
docker cp test ca53:/tmp
docker cp ca53:/tmp/test test2
8.如何在宿主机和容器之间共享文件:只需要在启动容器时使用-v
参数把本机的目录挂载到容器的目录,这样宿主机和容器内对这个共享目录的增删改动作都会同步
docker run -d --rm -v /tmp/test:/tmp/test redis
9.实现网络互通:Docker提供的三种网络模式,分别是null、host、bridge,启动镜像时使用--net=xx
来指定:
null,就是无网络,不常用 host,复用宿主机网络,去掉了宿主机和容器的网络隔离,通信效率高、但是缺少了隔离,容易导致端口号冲突。 bridge,桥接模式,这是默认模式,如果用 --net
指定默认用的就是桥接模式。这种模式下,容器的网络设置和宿主机完全不同
9.端口号映射:在bridge模式下,可以使用-p
参数设置本机端口号和容器端口号的映射。例如,可以启动2个Nginx容器,容器内部都是使用80端口号,但是在主机上映射为不同的端口号,这样就解决了端口号冲突的问题
docker run -d -p 80:80 nginx:alpine
docker run -d -p 8080:80 nginx:alpine
10.实战:搭建私有镜像仓:直接使用Docker的registry可以方便的搭建私有镜像:
拉取镜像、运行registry docker run -d -p 5000:5000 registry
使用 docker tag
打镜像,因为的私有镜像,必须在tag中加上私有仓库的地址docker tag mybosybox:qingming 127.0.0.1:5000/mybosybox:qingming
push到镜像仓 docker push 127.0.0.1:5000/mybosybox:qingming
下载和验证,证明私有镜像仓正常可用
docker pull 127.0.0.1:5000/mybosybox:qingming
curl 127.1:5000/v2/_catalog
curl 127.1:5000/v2/mybosybox/tags/list
11.实战:搭建一个WordPress网站:网站需要有3个容器,WordPress、MariaDB、Nginx。网络架构图如下:
下载镜像
docker pull wordpress:5
docker pull mariadb:10
docker pull nginx:alpine
启动MariaDB。通过 --env
指定启动参数
docker run -d --rm --env MARIADB_DATABASE=db --env MARIADB_USER=wp --env MARIADB_PASSWORD=123 --env MARIADB_ROOT_PASSWORD=123 mariadb:10
可以使用mysql客户端验证数据库在正常运行
启动WordPress,使用 --env
(和-e
等价)指定参数,主要数数据库的IP、用户等,数据库的IP就是MariaDB的IP,可以使用docker inspect xx | grep IPAddr
获取
docker run -d --rm -e WORDPRESS_DB_HOST=172.17.0.2 -e WORDPRESS_DB_USER=wp -e WORDPRESS_DB_PASSWORD=123 -e WORDPRESS_DB_NAME=db wordpress:5
配置 Nginx 反向代理:获取到WordPress的IP地址后,就可以生成如下的Nginx配置文件(wp.conf)
server {
listen 80;
default_type text/html;
location / {
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_pass http://172.17.0.3;
}
}
我们使用-p指令可以将wp.conf挂载到容器中的Nginx对应的配置文件上,使用如下指令启动容器
docker run -d --rm -p 80:80 -v `pwd`/wp.conf:/etc/nginx/conf.d/default.conf nginx:alpine
可以查看三个容器都已经启动:
部署成功:
此时查询对应的数据库,发现多了很多表:
证明部署成功!
12.实战:构建一个httpd镜像并运行:
基于centos基础镜像,打包httpd的镜像
FROM centos:8.1.1911
RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-* \
&& sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-* \
&& yum install -y httpd
COPY file1 /var/www/html
ADD file2.tar.gz /var/www/html
CMD ["/sbin/httpd", "-D", "FOREGROUND"]
docker build -t registry/httpd:v1 -f ./Dockerfile .
启动容器 docker run -d registry/httpd:v1
进入容器,查看进程状态和相关的文件是否存在 docker exec -it fc2 sh
获取容器的IP地址, docker exec fc2 ip addr
或者docker inspect fc2 | grep IPAddress
。使用IP地址下载文件。
可以直接在宿主机上,通过curl命令下载文件(宿主机的网络跟容器是通的,宿主机的IP地址为127.17.0.1)curl -L -O 172.17.0.2/file2
总结:容器的网络和文件系统跟宿主机隔离开了,网络上可以通过IP地址通信
13.实战:构建一个node应用镜像并运行:
应用代码
const http = require('http');
const os = require('os');
console.log("Kubia server starting...");
var handler = function(request, responese) {
console.log("Received request from " + request.connection.remoteAddress);
responese.writeHead(200);
responese.end("You've hit " + os.hostname() + "\n");
};
var www = http.createServer(handler);
www.listen(8080);
编写Dockerfile文件,并构建镜像
FROM node:7
ADD app.js /app.js
ENTRYPOINT ["node", "app.js"]
构建镜像docker build -t kubia .
(可以i不指定-f参数,默认会在当前路径寻找Dockerfile)
启动容器、查看状态
docker run --name kubia-container -p 8080:8080 -d kubia
使用应用,运行正常