概述
Docker是一种以应用为核心,对程序文件,运行时环境,软件依赖包都可以封装打包,部署的一种 技术手段
Docker的容器中没系统
开放理念
- 2014年,Docker开源罗 自己用Golang开发的Libcontainer
- 2015年,在Docker的倡导下,多个公司联合指定罗"开放容器交互标准",既OCI,这是一个关于容器格式和运行时规范文件,其中包含:
- 运行时标准(RUNTIME-SPEC)
- 容器镜像标准(IMAGE-SPEC)
- 镜像分发标准(DISTRIBUTION-SPEC)
- 三大概念
- 容器:一个运行在隔离环境中的程序
- 镜像:只读模板,包括篡创建容器所需要的文件和配置信息
- 仓库:存储,分发,管理镜像的空间
安装部署
# 开启路由转发功能
[root@docker ~]# echo 'net.ipv4.ip_forward = 1' >>/etc/sysctl.conf
# 打印system配置
[root@docker ~]# sysctl -p
# 安装Docker相关软件包
[root@docker ~]# dnf install -y docker-ce
# 开启Docker服务并开机自启动
[root@docker ~]# systemctl enable --now docker
# 查看服务器与客户端版本
[root@docker ~]# docker version
# 添加daemon.json,配置镜像仓库加速地址,比如阿里云,华为云官方的镜像仓库
[root@docker ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["这里配置镜像仓库加速器地址"],
"insecure-registries":[]
}
# 重启docker服务
[root@docker ~]# systemctl restart docker
# 查看 docker 服务配置信息
[root@docker ~]# docker info
镜像管理命令
docker images //查看本机镜像 -q 只打印镜像id列
docker pull 镜像名:标签 //从镜像加速地址提供的镜像库下载镜像
docker save 镜像名:标签 -o 备份文件名(比如:mylinux.tar) 将本机的镜像归档备份
// -o 用于指定保存生成docker镜像归档文件(通常为.tar文件)
docker load -i 备份文件名 导入备份镜像
docker history 镜像名:标签 查看镜像制作历史
docker rmi 镜像:标签 //删除镜像
docker tag 镜像id 镜像名:标签 //给镜像重命名
Vlog~删除镜像
docker rmi 镜像:标签 删除镜像 //删除单个镜像,后加多个,可删除多个
//对于已创建的容器的镜像无法删除
docker rmi -f ... //强制删除
会打印出 : Untagged: ... // 该容器的标签已删除
通过docker images 查询发现"<none> <none> ....." //没有了镜像名和标签
可以通过docker log id ... 重命名
docker rmi -f $(docker images -q) //删除所有本机镜像
容器管理命令
docker run -it(d) --name 容器名 镜像名:标签 //创建容器 -i 启动容器时保留其标准输入(交互) -t 请求docker分配一个pty伪终端 -d 后台运行
// 或者可以通过ctrl p + ctrl q 跳出容器并保持容器后台运行
docker ps //查看运行中的容器 -a 查看所有容器 -p 只打印容器id列
docker inspect 镜像:容器 //查看容器详细信息
docker start/stop/restart 容器id/NAMES //启动/停止/重启容器
docker exec -it 容器id/NAMES 启动命令 //交互式对容器执行指令
docker cp 本机路径 容器NAMES:/路径 //本机和容器之间拷贝文件
docker rm 容器id/NAMES //删除容器 -f 强制删除
docker logs 容器id/NAMES //查看容器日志
容器运行后台后如何进入交互式
docker run -itd 镜像:容器名 创建容器之后运行在后台中, 通过 docker exec -it /bin/bash 交互式命令即可进入容器内
docker exec -it /bin/ls 打印主目录ls 非交互式
案例
简单镜像制作
# 使用基础镜像创建一个容器
[root@docker ~]# docker run -itd --name linux rockylinux:8.5
# 删除容器内的Yum配置文件
[root@docker ~]# docker exec -it linux rm -rf /etc/yum.repos.d
# 拷贝宿主机的Yum配置文件到容器内
[root@docker ~]# docker cp /etc/yum.repos.d linux:/etc/
# 在容器内安装工具软件包
[root@docker ~]# docker exec -it linux dnf install -y net-tools vim-enhanced tree bash-completion iproute procps-ng psmisc
# 清理缓存文件
[root@docker ~]# docker exec -it linux dnf clean all
# 停止容器
[root@docker ~]# docker stop linux
# 把容器制作成镜像
[root@docker ~]# docker commit linux mylinux:latest
sha256:7a4449e20f4c59d1f6c4db838b4724cbf63c8f4195513c5f17d053c7752891d5
# 查看新制作的镜像
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mylinux latest b64da40467ae 3 seconds ago 249MB
rockylinux 8.5 210996f98b85 13 months ago 205MB
# 删除制作镜像的容器
[root@docker ~]# docker rm -f linux
linux
容器部署应用
- 部署 apache 服务
# 删除所有容器
[root@docker ~]# docker rm -f $(docker ps -aq)
# 创建一个名为 myweb 的容器
[root@docker ~]# docker run -it --rm --name myweb mylinux:latest
#-----------------------------------------------------------
# 在容器内安装部署 apache
[root@a7f9d0c3e3e2 /]# dnf install -y httpd
[root@a7f9d0c3e3e2 /]# echo "Hello World ." >/var/www/html/index.html
[root@a7f9d0c3e3e2 /]# cat /usr/lib/systemd/system/httpd.service
[root@a7f9d0c3e3e2 /]# export LANG=C
[root@a7f9d0c3e3e2 /]# /usr/sbin/httpd -DFOREGROUND
# 在另一个终端完成访问验证
- 为 apache 添加解析 php 文件支持
# ctrl + c 终止 httpd 服务运行
[root@a7f9d0c3e3e2 /]# dnf install -y php
[root@a7f9d0c3e3e2 /]# vim /etc/httpd/conf.modules.d/00-mpm.conf
11: LoadModule mpm_prefork_module ... ... # 去掉注释
17: # LoadModule mpm_event_module ... ... # 注释配置
[root@a7f9d0c3e3e2 /]# /usr/sbin/httpd -DFOREGROUND
# 服务不要关闭,在其他终端完成测试
- 验证配置
# 在另一个终端拷贝 public/info.php 到 docker 主机
[root@docker ~]# docker cp info.php myweb:/var/www/html/
[root@docker ~]# curl http://172.17.0.2/info.php
<pre>
Array
(
[REMOTE_ADDR] => 172.17.0.1
[REQUEST_METHOD] => GET
[HTTP_USER_AGENT] => curl/7.61.1
[REQUEST_URI] => /info.php
)
php_host: 616e75df56ae
1229
容器技术
镜像编排(Dockerfile)
Dockerfile是一种强大的镜像制作方式,通过编写dockerfile脚本文件自定义自己的镜像!
docker相关指令
指令 | 说明 |
---|---|
FROM | 指定基础镜像(唯一) |
RUN | 在容器内执行命令,可以写多条 |
ADD | 把文件拷贝的容器内,如果文件是 tar.xx 格式,会自动解压 |
COPY | 把文件拷贝的容器内,不会自动解压 |
ENV | 设置启动容器的环境变量 |
WORKDIR | 设置启动容器的默认工作目录(唯一) |
CMD | 容器默认的启动参数(唯一) |
ENTRYPOINT | 容器默认的启动命令(唯一) |
USER | 启动容器使用的用户(唯一) |
EXPOSE | 使用镜像创建的容器默认监听使用的端口号/协议 |
编写Dockerfile
步骤:创建制作目录---创建子目录Dockerfile脚本文件---通过docker build -t 起名:标签 制作目录的路径
例如Dockerfile脚本
///
FROM mylinux:latest
ENTRYPOINT ["echo"]
CMD ["/bin/ls", "-l"]
//以mylinux:latest为模板制作自定义镜像
//ENTRYPOINT ["echo"]表示以JSON数组形式指定一个可执行的命令(echo),每次创建镜像并启动容器时会自动执行echo命令.采用json就可以将参数传递给echo命令,不会被docker run后的额外参数覆盖!
//cmd指令为容器提供默认的执行参数或者命令,当容器运行时不指定命令时,会指定cmd指定的!如果docker run 后有参数,会将cmd指定的覆盖
//由于前面entrypoint指定echo,所以emd内的内容只能作为echo的输入参数!
///
FROM mylinux:latest
COPY myfile.tar /var/tmp/
// 将宿主机文件复制到容器上
ADD myfile.tar /tmp/
// 将宿主机解压到容器上
RUN id && touch /tmp/file1
// 运行逻辑双命令,左边通过右边才会执行,否则不执行右边
USER nobody
// 后续操作以nobody用户工作
RUN id && touch /tmp/file2
ENV mymsg="Hello World"
// 定义容易环境变量
WORKDIR /tmp
// 定义工作目录
CMD ["/bin/bash"]
//容器启动后以交互式Bash shell方式运行
///
制作http镜像
[root@docker ~]# mkdir nginx
# 将编译好的 nginx 打包,这里必须使用相对路径
[root@docker ~]# tar czf nginx/nginx.tar.gz -C /usr/local nginx
[root@docker ~]# vim nginx/Dockerfile
FROM mylinux:latest
//PCRE 是一个实现了 Perl 语言风格正则表达式的库,主要用于文本模式匹配和处理;OpenSSL 是一个开源的密码学库,提供了丰富的工具和库函数.
RUN dnf install -y pcre openssl && dnf clean all
ADD nginx.tar.gz /usr/local/
ENV PATH=${PATH}:/usr/local/nginx/sbin
WORKDIR /usr/local/nginx/html
//设置默认的监听端口
EXPOSE 80/tcp
CMD ["nginx", "-g", "daemon off;"]
//这一行命令指示基于该Dockerfile构建的容器在启动时直接运行 nginx 服务,并将其配置为非守护进程模式,以便于监控其输出和管理。这样构建的容器非常适合于在生产环境中部署 nginx,因为它简化了日志收集和故障排查,并且能够更好地与容器化环境的管理工具(如Kubernetes)集成。
[root@docker ~]# docker build -t nginx:latest nginx
Successfully tagged nginx:latest
验证镜像
docker run -itd --name myweb httpd:latest//启动镜像
docker inspect myweb |grep -i IPAddress //查看容器地址并访问该地址(curl测试)
可以制作多阶段镜像(编译nginx && 制作镜像)
例如
# 第一阶段编译程序
FROM mylinux:latest as builder
ADD nginx-1.22.1.tar.gz /
WORKDIR /nginx-1.22.1
RUN dnf install -y openssl-devel pcre-devel gcc make
RUN ./configure --prefix=/usr/local/nginx --with-pcre --with-http_ssl_module
RUN make && make install
RUN echo 'Nginx is running !' >/usr/local/nginx/html/index.html
# 第二阶段最终镜像
FROM mylinux:latest
RUN dnf install -y pcre openssl && dnf clean all
COPY --from=builder /usr/local/nginx /usr/local/nginx
ENV PATH=${PATH}:/usr/local/nginx/sbin
WORKDIR /usr/local/nginx/html
EXPOSE 80/tcp
CMD ["nginx", "-g", "daemon off;"]
私有仓库
将某一服务器制作为镜像的私有仓库,其他的服务器可以访问私有仓库上传并下载镜像!
前提准备
# 安装私有仓库[root@registry ~]# dnf install -y docker-distribution# 启动私有仓库,并设置开机自启动[root@registry ~]# systemctl enable --now docker-distribution
对所有的客户端nodej节点配置仓库的加速节点
// registry为私有仓库的服务器ip
[root@docker ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["http://registry:5000"],
"insecure-registries":["registry:5000"]
}
# 重启服务生效
[root@docker ~]# systemctl restart docker
私有仓库de使用
//首先设置标签
docker tag nginx:latest registry:5000/img/myimg:web
//上传镜像
docker push registry:5000/img/myimg:web
//导入镜像
docker pull registry:5000/img/myimg:web
//查看仓库
# 查看仓库中所有镜像的名称
[root@docker ~]# curl http://registry:5000/v2/_catalog
{"repositories":["img/myimg", "library/httpd"]}
# 查看某一镜像的所有标签
[root@docker ~]# curl http://registry:5000/v2/img/myimg/tags/list
{"name":"img/myimg","tags":["web", "php-fpm"]}
# 易读格式查看镜像名称
[root@docker ~]# curl -s http://registry:5000/v2/_catalog | python3 -m json.tool
{
"repositories": [
"img/myimg",
"library/httpd"
]
对外发布服务
端口绑定
//宿主机80端口绑定容器web的80端口,访问宿主的80即可访问容器的80对应的服务
docker run -itd --name web -p 80:80 myos:httpd
共享存储卷
//将宿主的webroot映射到容器的html目录
docker run -itd --rm --name mynginx -v /var/webroot:/usr/local/nginx/html myos:nginx
共享网络通信
//共享php容器,使用nginx的网络名称空间
docker run -itd --network=container:myniginx -v /var/webroot:/usr/local/nignx/html --rm --name myphp myos:php-fpm
//容器myphp和mynginx容器共享网络
容器服务排版
概念
Compose是一个定义和运行多容器的应用的工具,高效着管理配置中引用的所有容器服务,负责实现容器集群的快速编排.
在Compose中有两个核心概念,分别是服务和项目!
服务??一个容器包含多个实例
项目???多个容器组成完整业务
docker compose指令
指令 | 说明 |
---|---|
up | 创建项目并启动容器 |
down | 删除项目容器及网络 |
ls | 列出可以管理的项目 |
start/stop/restart | 启动项目/停止项目/重启项目 |
images | 列出项目使用的镜像 |
ps | 显示项目中容器的状态 |
logs | 查看下项目中容器的日志 |
compose 语法
指令 | 说明 |
---|---|
networks | 配置容器连接的网络 |
container_name | 指定容器名称 |
depends_on | 解决容器的依赖、启动先后的问题 |
command | 覆盖容器启动后默认执行的命令 |
environment | 设置环境变量 |
image | 指定为镜像名称或镜像 ID |
network_mode | 设置网络模式 |
restart | 容器保护策略[always、no、on-failure] |
ports | 暴露端口信息 |
volumes | 数据卷,支持 [volume、bind、tmpfs、npipe] |
单服务编排
# 安装 compose 组件
[root@docker ~]# dnf install -y docker-compose-plugin
# 创建项目
[root@docker ~]# vim docker-compose.yaml
name: websvc
version: "3"
services:
websvc:
container_name: nginx
image: myos:nginx
//容器项目管理
# 创建项目,并启动
[root@docker ~]# docker compose -f docker-compose.yaml up -d
[+] Running 2/2
⠿ Network websvc_default Created 0.0s
⠿ Container nginx Started 0.3s
//成功创建了默认网络和容器
# 查看项目
[root@docker ~]# docker compose ls
NAME STATUS CONFIG FILES
websvc running(1) /root/docker-compose.yaml
# 查看项目中的容器状态
[root@docker ~]# docker compose -p websvc ps
NAME COMMAND SERVICE STATUS PORTS
nginx "nginx -g 'daemon of…" websvc running 80/tcp
# 启动、停止、重启项目
[root@docker ~]# docker compose -p websvc stop/restart/start
# 查看项目中容器的日志
[root@docker ~]# docker inspect nginx |grep IPAddress
[root@docker ~]# curl http://172.17.0.2/info.php
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.22.1</center>
</body>
</html>
[root@docker ~]# docker compose -p websvc logs
nginx | 2023/02/13 13:55:39 [error] 7#0: *1 open() "/usr/local/nginx/html/info.php" failed (2: No such file or directory), client: 172.17.0.1, server: localhost, request: "GET /info.php HTTP/1.1", host: "172.17.0.2"
# 删除项目
[root@docker ~]# docker compose -p websvc down
[+] Running 2/2
⠿ Container nginx Removed 0.1s
⠿ Network websvc_default Removed 0.0s
多服务编排
[root@docker ~]# vim docker-compose.yaml
name: websvc
version: "3"
services:
nginxsvc:
container_name: nginx
image: myos:nginx
restart: always
volumes:
- type: bind
source: /var/webconf/nginx.conf
target: /usr/local/nginx/conf/nginx.conf
- type: bind
source: /var/webroot
target: /usr/local/nginx/html
network_mode: bridge
ports:
- 80:80
environment:
- "TZ=Asia/Shanghai"
php-fpm:
container_name: php-fpm
image: myos:php-fpm
restart: always
volumes:
- type: bind
source: /var/webroot
target: /usr/local/nginx/html
depends_on:
- nginxsvc
network_mode: "container:nginx"
# 创建,并启动项目
[root@docker ~]# docker compose -f docker-compose.yaml up -d
[+] Running 2/2
⠿ Container nginx Started 0.3s
⠿ Container php-fpm Started 0.3s
# 查看项目
[root@docker ~]# docker compose ls
NAME STATUS CONFIG FILES
websvc running(2) /root/docker-compose.yaml
# 查看容器状态,验证服务
[root@docker ~]# docker compose -p websvc ps
NAME COMMAND SERVICE STATUS
nginx "nginx -g 'daemon of..." nginx running ......
php-fpm "php-fpm --nodaemoni..." php-fpm running ......
# 访问 php 页面验证
[root@docker ~]# curl -s http://127.0.0.1/info.php
<pre>
Array
(
[REMOTE_ADDR] => 172.17.0.1
[REQUEST_METHOD] => GET
[HTTP_USER_AGENT] => curl/7.61.1
[REQUEST_URI] => /info.php
)
php_host: 7e037978c775
1229
//可以访问到php解析页面
harpor仓库搭建
harpor是企业级扩展,提供web页面,优化用户体验,支持多个扩展功能,涉及到web服务器,数据库服务器,程序代码,docker私有镜像仓库等等多个应用!
开始搭建
# 安装部署 docker 及 compose 组件
[root@harbor ~]# dnf install -y docker-ce docker-compose-plugin
[root@harbor ~]# systemctl enable --now docker
# 导入 harbor 项目镜像
[root@harbor ~]# tar -zxf harbor-v2.7.0.tgz -C /usr/local/
[root@harbor ~]# cd /usr/local/harbor
[root@harbor harbor]# docker load -i harbor.v2.7.0.tar.gz
# 创建 https 证书
[root@harbor harbor]# mkdir tls
[root@harbor harbor]# openssl genrsa -out tls/cert.key 2048
[root@harbor harbor]# openssl req -new -x509 -days 3650 -key tls/cert.key -out tls/cert.crt -subj "/C=CN/ST=BJ/L=BJ/O=Tedu/OU=NSD/CN=harbor"
# 修改配置文件
[root@harbor harbor]# cp harbor.yml.tmpl harbor.yml
[root@harbor harbor]# vim harbor.yml
05: hostname: harbor
08: # http:
10: # port: 80
17: certificate: /usr/local/harbor/tls/cert.crt
18: private_key: /usr/local/harbor/tls/cert.key
34: harbor_admin_password: admin123
# 预安装环境检查,生成项目文件
[root@harbor harbor]# /usr/local/harbor/prepare
# 创建并启动项目
[root@harbor harbor]# docker compose -f docker-compose.yml up -d
# 添加开机自启动
[root@harbor harbor]# chmod 0755 /etc/rc.d/rc.local
[root@harbor harbor]# echo "/usr/bin/docker compose -p harbor start" >>/etc/rc.d/rc.local
# 查看项目
[root@harbor harbor]# docker compose ls
NAME STATUS CONFIG FILES
harbor running(9) /usr/local/harbor/docker-compose.yml
# 查看容器状态
[root@harbor harbor]# docker compose -p harbor ps
NAME COMMAND SERVICE STATUS
harbor-core "/harbor/entrypoint.…" core running (healthy)
harbor-db "/docker-entrypoint.…" postgresql running (healthy)
harbor-jobservice "/harbor/entrypoint.…" jobservice running (healthy)
harbor-log "/bin/sh -c /usr/loc…" log running (healthy)
harbor-portal "nginx -g 'daemon of…" portal running (healthy)
nginx "nginx -g 'daemon of…" proxy running (healthy)
redis "redis-server /etc/r…" redis running (healthy)
registry "/home/harbor/entryp…" registry running (healthy)
registryctl "/home/harbor/start.…" registryctl running (healthy)
harbor管理
容器管理命令 | 说明 |
---|---|
docker login | 登录私有镜像仓库 |
docker logout | 退出登录 |
# 添加主机配置
[root@docker ~]# vim /etc/hosts
192.168.1.30 harbor
192.168.1.35 registry
# 添加私有仓库配置
[root@docker ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://harbor:443", "http://registry:5000"],
"insecure-registries":["harbor:443", "registry:5000"]
}
[root@docker ~]# systemctl restart docker
# 登录 harbor 仓库
[root@docker ~]# docker login harbor:443
Username: luck
Password: ********
... ...
Login Succeeded
# 认证信息记录文件
[root@docker ~]# cat /root/.docker/config.json
{
"auths": {
"harbor:443": {
"auth": "bHVjazoqKioqKioqKg=="
}
}
}
# 设置标签
[root@docker ~]# docker tag rockylinux:8.5 harbor:443/myimg/rockylinux:8.5
# 上传镜像到harpor仓库
[root@docker ~]# docker push harbor:443/myimg/rockylinux:8.5
# 退出登录
[root@docker ~]# docker logout harbor:443