容器化入门(二)--docker实战

文摘   科技   2024-05-01 22:37   美国  

容器化入门(二)--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 savedocker 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
  • 使用应用,运行正常


编程废柴
努力Coding