Docker

概述

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

 

  • 21
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值