Dockers&&Docker-compose

目录

1,bash通用安装

2,docker核心概念

3,配置国内镜像加速

4,docker镜像及容器相关操作

5,离线安装

6,dockerfile格式

7,基于alpine制作镜像

8,基于ubuntu制作镜像

9,镜像分层构建及实现tomcat

10,镜像分层构建及实现nginx

11,HAProxy镜像

12,docker-compose

13,haubor仓库 


1,bash通用安装

A:执行下载docker引擎的脚本文件
    curl -fsSL get.docker.com -o get-docker.sh

B:执行脚本通过脚本下载,并设置阿里云加速
    sh get-docker.sh --mirror Aliyun

C:启动docker服务:
    systemctl start docker ;systemctl enable --now docker
    systemctl status docker

D:创建docker用户组,将当前用户加入docker组
    groupadd docker;usermod -aG docker $USER

E:查看docker安装的信息
    docker info;docker version

F:docker会出现如下情况:客户端引擎和服务端引擎
 Client: Docker Engine - Community
 Version:           23.0.5
 API version:       1.42
 Go version:        go1.19.8
 Git commit:        bc4487a
 Built:             Wed Apr 26 16:18:56 2023
 OS/Arch:           linux/amd64
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          23.0.5
  API version:      1.42 (minimum version 1.12)
  Go version:       go1.19.8
  Git commit:       94d3ad6
  Built:            Wed Apr 26 16:16:35 2023
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.21
  GitCommit:        3dce8eb055cbb6872793272b4f20ed16117344f8
 runc:
  Version:          1.1.7
  GitCommit:        v1.1.7-0-g860f061
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0


G: runc 低阶运行时
    dockershim 中间人
    containerd  高阶运行时
containerd 接受客户端命令,通过dockershim传递给runc进行处理

2,docker核心概念

镜像: images
    定义:一个镜像就是代表一个软件

容器:container
    定义:一个镜像运行一次就会生一个容器,容器就是一个运行的软件服务

仓库:registry
    定义:存储镜像软件的位置 ===》 仓库web页面:docker hub或私有镜像仓库harbor(需自己搭建)
        https://hub.docker.com/
国内地址:https://www.daocloud.io/

镜像:一个镜像代表一个虚拟环境,是一个只读的文件,如mysql镜像,redis镜像等

容器:镜像每次运行之后就产生一个容器,就是正在运行的镜像文件,特点是可读可写

仓库:用来存储镜像的位置,类似于maven仓库,也是经i选哪个下载和上传的位置

dockerfile:docker生成镜像的配置文件,用来书写自定义镜像的一些配置信息

tar:镜像的打包文件,之后可以还原成镜像

3,配置国内镜像加速

查看
[root@localhost ~]#dockerd --help | grep json
      --config-file string                      Daemon configuration file (default "/etc/docker/daemon.json")
      此文件默认没有,需要自己创建:
       vim /etc/docker/daemon.json

{
    "registry-mirrors": [
        "http://hub-mirror.c.163.com",
        "https://docker.mirrors.ustc.edu.cn",
        "https://registry.docker-cn.com"
    ]
}


之后重新加载docker:
    systemctl daemon-reload;systemctl restart docker;docker info

查看Registry Mirrors:
  http://hub-mirror.c.163.com/
  https://docker.mirrors.ustc.edu.cn/
  https://registry.docker-cn.com/


核心目录:
软件数据目录 /var/lib/docker/
专属服务目录 /etc/docker

测试:docker run hello-world

4,docker镜像及容器相关操作

[root@localhost ~]#docker images --help

Usage:  docker images [OPTIONS] [REPOSITORY[:TAG]]

List images

Aliases:
  docker image ls, docker image list, docker images

Options:
  -a, --all             Show all images (default hides intermediate images)
      --digests         Show digests
  -f, --filter filter   Filter output based on conditions provided
      --format string   Format output using a custom template:
                        'table':            Print output in table format with column headers (default)
                        'table TEMPLATE':   Print output in table format using the given Go template
                        'json':             Print in JSON format
                        'TEMPLATE':         Print output using the given Go template.
                        Refer to https://docs.docker.com/go/formatting/ for more information about formatting output with templates
      --no-trunc        Don't truncate output
  -q, --quiet           Only show image IDs
选项:
全部显示所有图像(默认为隐藏中间图像)
——摘要显示了摘要
-f,过滤器过滤器输出基于提供的条件
——使用自定义模板格式化字符串格式输出:
“表”:以带有列标题的表格格式打印输出(默认值)
“表格模板”:使用给定的Go模板以表格格式打印输出
“JSON”:打印在JSON格式
“模板”:使用给定的Go模板打印输出。
有关使用模板格式化输出的更多信息,请参阅https://docs.docker.com/go/formatting/
-不截断输出
-安静,只显示图像id



*****docker --help

Usage:  docker [OPTIONS] COMMAND

A self-sufficient runtime for containers

Common Commands:
  run         Create and run a new container from an image 
                运行“创建”,并从映像中运行一个新的容器
  exec        Execute a command in a running container
                执行:在正在运行的容器中执行一个命令
  ps          List containers
                ps列表容器
  build       Build an image from a Dockerfile
                从码头文件构建映像
  pull        Download an image from a registry
                从注册表中下载一个图像
  push        Upload an image to a registry
                将图像上传推送到注册表
  images      List images
                 图像列表图像
  login       Log in to a registry
                登录名:登录到注册表
  logout      Log out from a registry
                 注销从注册表中注销
  search      Search Docker Hub for images
                 搜索搜索码头工人中心的图像
  version     Show the Docker version information
                版本显示Docker版本信息
  info        Display system-wide information
                信息显示:系统范围内的信息
   
    
    

Management Commands:
  builder     Manage builds
               构建器管理构建 
  buildx*     Docker Buildx (Docker Inc., v0.10.4)
                 Docker构建镜像*(DockerInc.,v0.10.4)
  compose*    Docker Compose (Docker Inc., v2.17.3)
               Docker编排工具(Docker Inc.,v2.17.3)
  container   Manage containers
                容器管理容器
  context     Manage contexts
                上下文管理上下文
  image       Manage images
                图像管理图像
  manifest    Manage Docker image manifests and manifest lists
                清单管理Docker映像清单和清单列表
  network     Manage networks
                网络管理网络
  plugin      Manage plugins
               插件管理插件 
  system      Manage Docker
                系统管理文档
  trust       Manage trust on Docker images
                信任,管理对Docker映像的信任
  volume      Manage volumes    
               卷管理卷 

Swarm Commands:
  swarm       Manage Swarm

Commands:
  attach      Attach local standard input, output, and error streams to a running container       将本地标准的输入、输出和错误流附加到正在运行的容器     
  commit      Create a new image from a container's changes
                提交从容器的更改中创建一个新的图像
  cp          Copy files/folders between a container and the local filesystem
                在容器和本地文件系统之间复制文件/文件夹
  create      Create a new container
                创建:创建一个新的容器
  diff        Inspect changes to files or directories on a container's filesystem
                差异检查对容器的文件系统上的文件或目录的更改
  events      Get real time events from the server
                事件从服务器获取实时事件
  export      Export a container's filesystem as a tar archive
                导出将容器的文件系统导出为tar存档
  history     Show the history of an image
                历史显示一个图像的历史
  import      Import the contents from a tarball to create a filesystem image
                导入从目标中导入内容以创建文件系统映像
  inspect     Return low-level information on Docker objects
                检查返回有关Docker对象的低级信息
  kill        Kill one or more running containers
                杀死,杀死一个或多个正在运行的容器
  load        Load an image from a tar archive or STDIN
                从tar存档或STDIN加载图像
  logs        Fetch the logs of a container
                日志获取一个容器的日志
  pause       Pause all processes within one or more containers
                暂停暂停一个或多个容器中的所有进程
  port        List port mappings or a specific mapping for the container
                端口列表端口映射或容器的特定映射
  rename      Rename a container
                重命名重命名容器
  restart     Restart one or more containers
                重新启动,重新启动一个或多个容器
  rm          Remove one or more containers
                删除一个或多个容器
  rmi         Remove one or more images
                删除一个或多张图像
  save        Save one or more images to a tar archive (streamed to STDOUT by default)
               保存一个或多个图像保存到tar存档(默认情况下流到STDOUT) 
  start       Start one or more stopped containers
               启动,启动一个或多个已停止的容器 
  stats       Display a live stream of container(s) resource usage statistics
               统计数据显示容器资源使用情况统计数据的实时流 
  stop        Stop one or more running containers
                停止停止一个或多个正在运行的容器
  tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
               标记创建一个引用为SOURCE_IMAGE的标记TARGET_IMAGE 
  top         Display the running processes of a container
                顶部显示容器的运行进程
  unpause     Unpause all processes within one or more containers
                取消暂停取消暂停一个或多个容器中的所有进程
  update      Update configuration of one or more containers
                更新一个或多个容器的更新配置
  wait        Block until one or more containers stop, then print their exit codes
                等待块,直到一个或多个容器停止,然后打印其退出代码



Global Options:
      --config string      Location of client config files (default "/root/.docker")
  -c, --context string     Name of the context to use to connect to the daemon (overrides DOCKER_HOST env var and default context set with "docker context use")
  -D, --debug              Enable debug mode
  -H, --host list          Daemon socket(s) to connect to
  -l, --log-level string   Set the logging level ("debug", "info", "warn", "error", "fatal") (default "info")
      --tls                Use TLS; implied by --tlsverify
      --tlscacert string   Trust certs signed only by this CA (default "/root/.docker/ca.pem")
      --tlscert string     Path to TLS certificate file (default "/root/.docker/cert.pem")
      --tlskey string      Path to TLS key file (default "/root/.docker/key.pem")
      --tlsverify          Use TLS and verify the remote
  -v, --version            Print version information and quit

Run 'docker COMMAND --help' for more information on a command.

For more help on how to use Docker, head to https://docs.docker.com/go/guides/


全局选项:
——配置字符串客户端配置文件的位置(默认值为“/root/.docker”)
-c,——上下文字符串用于连接到守护进程的上下文的名称(用“文档器上下文使用”覆盖DOCKER_HOST env var和默认上下文设置)
-调试启用调试模式
主机列表守护进程插接字(s)
-l、--日志级别字符串设置日志记录级别(“调试”、“info”、“警告”、“错误”、“致命”)(默认为“info”)
——TLS使用TLS;隐含的——TLS验证
——tlscacert字符串信任证书仅由此CA签名(默认为“/root/.docker/ca.pem”)
——Tlscert字符串路径到TLS证书文件(默认“/root/.docker/cert.pem”)
——TLS key字符串到TLS关键字文件的路径(默认为“/root/.docker/key.pem”)
--验证使用TLS并验证远程器
打印版本信息并退出

运行“docker命令——帮助”以获取关于命令的更多信息。

想了解更多关于如何使用Docker的帮助,请访问https://docs.docker.com/go/guides/


1,镜像操作

1,查看镜像:docker images
REPOSITORY   TAG       IMAGE ID   CREATED        SIZE
镜像名称      镜像版本   镜像ID     镜像创建时间    镜像大小


2,搜索镜像:docker search 镜像名称
例:docker search tomcat
NAME(镜像名称) DESCRIPTION (描述信息)STARS(星级)OFFICIAL(官方镜像)AUTOMATED(三方上传)



3,下载镜像:docker pull 镜像名称:可指定版本号,不指定则拉取最新镜像latest
 例:docker pull tomcat  ---》 默认最新版本latest
     docker pull tomcat:7.0  ---》指定版本号

4,删除镜像:docker rmi 镜像名或者镜像ID(dockers正在运行中禁止删除)
            docker rmi -f  镜像名或ID(强制删除)
例:docker rmi 448a08f1d2f9

5,查看指定的镜像:docker images 镜像名称

6,只查看镜像ID:docker images -q
例:docker images nginx -q

7,查看所有镜像ID:docker ps -qa 

8,批量删除多有镜像:docker rm -fv $(docker ps -qa)

2,容器相关操作

命令格式:
    docker [OPTIONS] COMMAND
常用格式:
    docker run -it -d -p -v --name   镜像名称
    -i,-交互式保持STDIN打开,即使没有连接
    -t,分配一个伪tty
    -d,后台运行
    -p,端口映射
    -v,数据映射
    --name 指定名称

1,查看docker引擎中正在运行的容器:
    docker ps 
CONTAINER ID   IMAGE     COMMAND          CREATED      STATUS    PORTS      NAMES
    容器ID    镜像名称   容器内执行的命令  创建及运行时间   状态    映射端口    容器名称(可自定义名称)


2,运行容器命令:
    docker run --help
    docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

3,运行容器时,设置容器与宿主机的端口映射,设置端口映射,在启动容器时,iptables或及那个映射的端口添加至防火墙开放列表中
    
     -p 宿主机端口:容器端口 
    可映射多个端口:用-p选项指定:-p 8080:8080 -p 8001:80 -p 5672:5672

例:docker run -it -p 8080:8080  tomcat:8.0

4,后台运行容器:
     -d 后台运行该容器
例:docker run -it -d -p 8080:8080  tomcat:8.0

5,指定容器名称 --name
例:docker run -it -d -p 8081:8080 --name tomcat1 tomcat:8.0

6,删除容器:
    docker rm  容器ID   -----》删除已经停止的容器
    docker rm -f  容器ID  -----》强制删除(运行中的容器也可以删除)
    docker rm -f $(docker ps -qa)----》删除所有容器

7,查看容器日志:
    docker logs 容器名|容器ID
    docker logs -t 加时间戳查看日志
    docker logs -f  容器名|容器ID  ----》实时查看容器日志

8,进入容器内部
    docker exec -it 容器ID /bin/bash
    docker exec -it 容器ID bash
    docker exec -it 容器ID sh
    

docker容器的停止,启动,重启,暂停,恢复
docker stop 容器ID|容器名称
docker start  容器ID|容器名称
docker restart  容器ID|容器名称
docker pause 容器ID|容器名称    暂停
docker unpause 容器ID|容器名称  恢复



Options:
      --add-host list                  添加一个自定义的主机到ip的映射(主机:ip)
  -a, --attach list                    -a,--附加列表附加到STDIN、STDOUT或STDERR
      --blkio-weight uint16            blkio重量uint16块IO(相对重量),在10和1000之间,或0以禁用(默认为0)
      --blkio-weight-device list       块IO重量(相对设备重量)(默认[])
      --cap-add list                   添加Linux功能
      --cap-drop list                  删除Linux功能
      --cgroup-parent string           可选容器的可选父cgroup
      --cgroupns string                要使用的群组字符串群组名称空间(主机|私有)
                                       “主机”:在Docker主机的cgroup命名空间中运行该容器
                                       “私有”:在容器自己的私有cgroup命名空间中运行该容器
                                       “”:使用所配置的cgroup名称空间,守护进程上的默认分组模式选项(默认)
      --cidfile string                 将容器ID写入该文件
      --cpu-period int                 -CPU周期内部限制CPUCFS(完全公平的调度程序)周期
      --cpu-quota int                  --限制CPUCFS(完全公平的调度程序)配额
      --cpu-rt-period int              限制CPU的实时周期,单位为微秒
      --cpu-rt-runtime int             限制CPU实时运行时,单位为微秒
  -c, --cpu-shares int                 -c,—CPU共享内部CPU共享(相对权重)
      --cpus decimal                   CPUs十进制的cpu数
      --cpuset-cpus string             CPUs十进制的cpu数
      --cpuset-mems string             允许执行的内存模块字符串(0-3、0、1)
  -d, --detach                         在后台分离运行容器,并打印容器ID
      --detach-keys string             覆盖用于分离容器的键序列
      --device list                    设备列表添加主机设备到容器
      --device-cgroup-rule list        将规则添加到允许的设备列表中
      --device-read-bps list           从设备读取速率(每秒字节)(默认[])
      --device-read-iops list          设备读取列表限制设备读取速率(每秒IO)(默认[])
      --device-write-bps list          设备写基点列表限制设备的写速率(每秒字节)(默认[])
      --device-write-iops list         设备写操作操作列表限制设备的写速率(每秒IO)(默认[])
      --disable-content-trust          禁用内容信任,跳过映像验证(默认为true)
      --dns list                       dns列表设置自定义DNS服务器
      --dns-option list                设置DNS选项
      --dns-search list                设置自定义DNS搜索域
      --domainname string              域名字符串容器NIS域名
      --entrypoint string              域名字符串容器NIS域名
  -e, --env list                       env列表设置环境变量
      --env-file list                  在环境变量文件中读取
      --expose list                    暴露列表暴露一个端口或一系列端口
      --gpus gpu-request               gpugpu请求GPU设备添加到容器(“所有”通过所有gpu)
      --group-add list                 组添加列表添加要加入的其他组
      --health-cmd string              运行状况的cmd字符串命令,要运行以检查运行状况
      --health-interval duration       运行状况间隔持续时间运行检查之间的时间(ms||m|h)(默认0s)
      --health-retries int             健康重试和报告不健康状况所需要的连续失败      
      --health-start-period duration   -运行状况开始期间持续时间开始运行状况重试倒计时前初始化的容器的开始期间(ms||m|h)(默认0)
      --health-timeout duration        运行状况超时持续时间允许一次检查运行的最大时间(ms||m|h)(默认值为0s)
      --help                          帮助打印工具的使用
  -h, --hostname string                主机名字符串容器主机名
      --init                           init在容器内运行一个转发信号和捕获进程的init

  -i, --interactive                   -i,-交互式保持STDIN打开,即使没有连接
      --ip string                      ip字符串IPv4地址(如172.30.100.104)
      --ip6 string                     ip6字符串IPv6地址(例如,2001:db8::33)
      --ipc string                     要使用的IPC字符串IPC模式
      --isolation string               隔离字符串、容器隔离技术
      --kernel-memory bytes            内核内存字节的内核内存限制
  -l, --label list                     -l,——标签列表设置容器上的元数据
      --label-file list                标签文件列表在以行分隔的标签文件中读取
      --link list                      链接列表添加链接到另一个容器
      --link-local-ip list             链路本地i列表容器IPv4/IPv6链路本地地址
      --log-driver string              日志驱动程序字符串日志驱动程序
      --log-opt list                   日志驱动程序选项
      --mac-address string             容器MAC地址(例如,92:d0:c6:0a:29:33)


  -t, --tty                            分配一个伪tty
      --ulimit ulimit                  超限选项(默认[])







5,离线安装

获取软件
mkdir /data/softs
wget -c https://download.docker.com/linux/static/stable/x86_64/docker-
20.10.14.tgz


解压软件
tar xf docker-20.10.14.tgz -C /usr/local/bin --strip-components=1
注意:
--strip-components=1 表示仅仅将该压缩文件中的内容,解压到指定的目录中


创建依赖目录
mkdir /var/lib/docker /etc/docker

创建service服务文件
# vim /usr/lib/systemd/system/docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
ExecStart=/usr/local/bin/dockerd -H unix:///var/run/docker.sock --data-
root=/var/lib/docker
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target


添加国内加速仓库:
# vim /etc/docker/daemon.json
{
"registry-mirrors": [], "insecure-registries": []
}



创建用户组
groupadd docker
将当前用户加入到指定用户组
usermod -aG docker $USER
更新用户组
newgrp docker


启动服务:
重载配置文件
systemctl daemon-reload
systemctl start docker
systemctl enable docker


查看信息:docker info

6,dockerfile格式

FROM:
语法:
FROM <image>
FROM <image>:<tag>。
解释:
FROM 是 Dockerfile 里的第一条而且只能是除了首行注释之外的第一条指令


MAINTAINER:
语法:
MAINTAINER <name>
解释:
指定该dockerfile文件的维护者信息。类似我们在docker commit 时候使用-a参数指定的信息

RUN:
语法:
RUN <command>                                (shell模式)
RUN ["executable", "param1", "param2"]。      (exec 模式)
解释:
表示当前镜像构建时候运行的命令

shell模式 类似于 /bin/bash -c command RUN echo hello
exec 模式 类似于 RUN ["/bin/bash", "-c", "command"] RUN ["echo", "hello"]


EXPOSE:
语法:
EXPOSE <port> [<port>...]
解释:
设置Docker容器对外暴露的端口号,Docker为了安全,不会自动对外打开端口,如果需要外部提供访
问,还需要启动容器时增加-p或者-P参数对容器的端口进行分配。


ENTRYPOINT:
语法:
 ENTRYPOINT ["executable", "param1","param2"]     (exec 模式)
 ENTRYPOINT command param1 param2               (shell模式)
解释:
每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。


ADD:
语法:
 ADD <src>... <dest>
 ADD ["<src>",... "<dest>"]
 
解释:
将指定的 文件复制到容器文件系统中的
 src 指的是宿主机,dest 指的是容器
 如果源文件是个压缩文件,则docker会自动帮解压到指定的容器中(无论目标是文件还是目录,都会当成
目录处理)。



COPY:
语法:
 COPY <src>... <dest>
 COPY ["<src>",... "<dest>"]
 
解释:
单纯复制文件场景,Docker推荐使用COPY


VOLUME:
语法:
  VOLUME ["/data"]
 
解释:
VOLUME 指令可以在镜像中创建挂载点,这样只要通过该镜像创建的容器都有了挂载点
通过 VOLUME 指令创建的挂载点,无法指定主机上对应的目录,是自动生成的。


ENV:
语法:
 ENV <key> <value>
 ENV <key>=<value> ...
 
解释:
设置环境变量,可以在RUN之前使用,然后RUN命令时调用,容器启动时这些环境变量都会被指定。


WORKDIR:
语法:
WORKDIR /path/to/workdir          (shell 模式)
解释:
切换目录,为后续的RUN、CMD、ENTRYPOINT 指令配置工作目录。 相当于cd




例:ssh镜像
创建Dockerfile专用目录
mkdir /docker/images/ssh -p
cd /docker/images/ssh
创建秘钥认证
ssh-keygen -t rsa
cat ~/.ssh/id_rsa.pub > authorized_keys
定制Dockerfile
# 构建一个基于ubuntu的ssh定制镜像
# 基础镜像
FROM ubuntu
# 镜像作者
MAINTAINER President.Wang 000000@qq.com
# 安装 ssh 服务
RUN apt-get update && apt-get install -y openssh-server curl vim net-tools &&
mkdir -p /var/run/sshd && mkdir -p /root/.ssh && sed -i "s/.*pam_loginuid.so/#&/"
/etc/pam.d/sshd && apt-get autoclean && apt-get clean && apt-get autoremove
# 复制配置文件到相应位置,并赋予脚本可执行权限
ADD authorized_keys /root/.ssh/authorized_keys
# 对外端口
EXPOSE 22
# 启动ssh
CMD ["/usr/sbin/sshd","-D"]

构建镜像
docker build -t ubuntu-ssh .
使用新镜像启动一个容器,查看效果
docker run -d -p 10086:22 ubuntu-ssh
容器检查
docker ps
docker port c03d146b64d4
ssh查看效果
ssh 192.168.8.12 -p 1008

7,基于alpine制作镜像

docker pull alpine
docker run -it alpine sh


apk -help(安装帮助)
apk add vim (安装vim)


mkdir -p /opt/dockerfile/web/{nginx-ubuntu,nginx-alpine}
cd /pt/dockerfile/web/nginx-alpine
rz nginx-1.22.0.tar.gz

vim repositories(此mirrors.aliyun.com可能会报错,需在Dockerfile中注释掉)
#http://dl-cdn.alpinelinux.org/alpine/v3.11/main
#http://dl-cdn.alpinelinux.org/alpine/v3.11/community

http://mirrors.aliyun.com/alpine/v3.11/main
http://mirrors.aliyun.com/alpine/v3.11/community


cat Dockerfile

FROM alpine
LABLE ()作者信息
ADD repositories /etc/apk/repositories
RUN apk update && apk add iotop gcc libgcc libc-dev libcurl pcre-dev zlib-dev libnfs make pcre2 zip unzip net-tools pstree wget libevent libevent-dev iproute2
RUN addgroup -g 2022 -S nginx && adduser -s /sbin/nologin -S -D -u 2022 -G nginx 
RUN addgroup -g 2022 -S www && adduser -s /sbin/nologin -S -D -u 2022 -G www
(以上可做基础镜像)

ADD nginx-1.22.0.tar.gz /usr/local/src
RUN /usr/local/src/nginx-1.22.0  && ./configure --prefix=/apps/nginx && make && make install
RUN ln -sv /apps/nginx/sbin/nginx /usr/sbin
(以上可作nginx基础镜像)

ADD nginx.conf /apps/nginx/conf
ADD html.tar.gz /apps/nginx/html
RUN cd /apps/nginx/html && rm -rf html.tar.gz
CMD ["nginx"] (启动命令)
(业务镜像)

cat build-command.sh
docker build -t nginx-1.22.0:alpine-basev1 .


启动容器测试:
docker run -it --rm -p 80:80 nginx-1.22.0:alpine-basev1

在浏览器访问

8,基于ubuntu制作镜像


docker pull ubuntu:18.04(可指定版本号)

mkdir -p /opt/dockerfile/web/{nginx-ubuntu,nginx-alpine}
cd /pt/dockerfile/web/nginx-ubuntu
rz nginx-1.22.0.tar.gz

cat sources.list
deb https://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse

..........(填写阿里云中ubuntu的镜像地址)



cat Dockerfile

FROM ubuntu:18.04
LABLE ()作者信息
ADD sources.list /etc/apt/sources.list (如果出现报错,可注释,使用官方源)
RUN apt update && apt -y install iproute2 ntpdate tcpdump telnet traceroute nfs-kernel-server nfs-common lrzsz tree openssl libssl-dev libpcre3 libpcre3-dev zlib1g-dev  gcc openssh-server  iotop unzip zip make && apt clean
RUN groupadd -g 2022 nginx && useradd -s /sbin/nologin -g nginx -u 2022  nginx 
RUN groupadd -g 2022 www && useradd -s /sbin/nologin -g www -u 2022  www 
(以上可做基础镜像)


ADD nginx-1.22.0.tar.gz /usr/local/src
RUN /usr/local/src/nginx-1.22.0  && ./configure --prefix=/apps/nginx && make && make install
RUN ln -sv /apps/nginx/sbin/nginx /usr/sbin
(以上可作nginx基础镜像)


ADD nginx.conf /apps/nginx/conf
ADD html.tar.gz /apps/nginx/html
RUN cd /apps/nginx/html && rm -rf html.tar.gz
CMD ["nginx"] (启动命令)
(业务镜像)

cat build-command.sh
docker build -t nginx-1.22.0:ubuntu-basev1 .


启动容器测试:
docker run -it --rm -p 80:80 nginx-1.22.0:ubuntu-basev1

在浏览器访问



9,镜像分层构建及实现tomcat

1,基于官方镜像,centos,ubuntu,debain,alpine等基础镜像构建JDK(java环境),然后在基于自定义的JDK镜像构建出业务需要的tomcat镜像

2,构建JDK镜像:

        先基于官方提供的基础镜像,制作出安装了常用命令的自定义基础镜像,然后在基础镜像的基础上,在制作JDk镜像,tomcat镜像等

1.1centos基础镜像

#docker pull centos
#mkdir
/opt/dockerfile/{web/{nginx,tomcat,jdk,apache},system/{centos,ubuntu,alpine,debain}} -pv

#cd /opt/dockerfile/system/centos
#cat Dockerfile
#Centos Base image(注释)
FROM centos:latest (可指定版本)
MAINTAINER 作者信息
RUN rpm -ivh http://mirrors.aliyun.com/epel/epel-release-7.noarch.rpm
RUN yum install -y epel-release
RUN yum -y install vim-enhanced tcpdump lrzsz tree telnet bash-completion net-tools wget bzip2 lsof tmux man-pages zip unzip nfs-utils gcc make gcc-c++ glibc glibc-devel pcre pcre-devel openssl  openssl-devel systemd-devel zlib-devel
RUN groupadd www -g 2023 && useradd www -u 2023 -g www && groupadd nginx -g 2023 && useradd nginx -u 2023 -g nginx #添加系统账户(通用用户可在此创建)


#cat build-command.sh   通过脚本构建镜像
#!/bin/bahs
docker build -t centos-base:v1 .

#bash biuld-command.sh执行构建镜像

        2.1JDK基础镜像

cd /opt/dockerfile/web/jdk
mkdir jdk-8u212 && cd jdk-8u212

cat Dockerfile
FROM centos-base:v1
MAINTAINER (作者信息)

#jdk.tar.gz安装包也要在此目录中,先在宿主机中做好/etc/profile的环境变量,将profile文件拷贝至此目录
ADD jdk-8u212-linux-x64.tar.gz /usr/local/src
RUN ln -sv /usr/local/src/jdk1.8.0_212 /usr/local/jdk
ADD profile /etc/profile 

ENV JAVA_HOME /usr/local/jdk
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/:$JRE_HOME/lib
ENV PATH $PATH:$JAVA_HOME/bin

RUN rm -rf  /etc/localtime && ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime


cat build-command.sh
#!/bin/bash
docker build -t centos-jdk:8u212 .



构建完成后,进入容器执行java -version
此镜像继承www和nginx用户组

        3,tomcat基础镜像

cd /opt/dockerfile/web/tomcat
mkdir tomcat8.5.51-base && cd tomcat8.5.51-base 
   rz apache-tomcat-8.5.51.tar.gz



cat Dockerfile
FROM centos-jdk:8u212
LABEL (作者信息)

ADD apache-tomcat-8.5.51.tar.gz /apps
RUN ln -sv /apps/apache-tomcat-8.5.51 /apps/tomcat



cat build-command.sh
!#/bin/bash
docker build -t centos-tomcat:8.5.51 .



制作完成之后进入容器测试:
docker run -it --rm -p 8080:8080 centos-tomcat:8.5.51 bash
#/apps/tomcat/bin/catalina.sh start
#ss -tnl


之后在浏览器进行验证

        4,tomcat业务镜像

cd /opt/dockerfile/web/tomcat
mkdir tomcat-app1 && cd tomcat-app1
  rz server.xml(优化和更改完成之后的配置文件)
  rz index.html.tar.gz


cat Dockerfile

FROM centos-tomcat:8.5.51
ADD server.xml /apps/tomcat/conf/server.xml
ADD index.html.tar.gz /data/tomcat/webapps(此目录在server.xml中查看)
ADD run_tomcat.sh /apps/tomcat/bin/run_tomcat.sh
RUN chown -R www.www /apps
EXPOSE 8080 8005 8009
CMD ["/apps/tomcat/bin/run_tomcat.sh"]


cat run_tomcat.sh
#!/bin/bash
su - www -c "/apps/tomcat/bin/catalina.sh start'
tail -f /etc/hosts  (添加守护进程,变化量较小的文件)
chmod a+x run_tomcat.sh (不加权限启动镜像时会报错)


cat build-command.sh
!#/bin/bash
docker build -t tomcat-app1:v1 .

docker run -it --rm -p 8080:8080 tomcat-app1:v1 
在容器例查看ss -tnl
在浏览器进行访问 /index.html







10,镜像分层构建及实现nginx

     1,构建基础镜像

​
#docker pull centos
#mkdir
/opt/dockerfile/{web/{nginx,tomcat,jdk,apache},system/{centos,ubuntu,alpine,debain}} -pv

#cd /opt/dockerfile/system/centos
#cat Dockerfile
#Centos Base image(注释)
FROM centos:latest (可指定版本)
MAINTAINER 作者信息
RUN rpm -ivh http://mirrors.aliyun.com/epel/epel-release-7.noarch.rpm
RUN yum install -y epel-release
RUN yum -y install vim-enhanced tcpdump lrzsz tree telnet bash-completion net-tools wget bzip2 lsof tmux man-pages zip unzip nfs-utils gcc make gcc-c++ glibc glibc-devel pcre pcre-devel openssl  openssl-devel systemd-devel zlib-devel
RUN groupadd www -g 2023 && useradd www -u 2023 -g www && groupadd nginx -g 2023 && useradd nginx -u 2023 -g nginx #添加系统账户(通用用户可在此创建)


#cat build-command.sh   通过脚本构建镜像
#!/bin/bahs
docker build -t centos-base:v1 .

#bash biuld-command.sh执行构建镜像

​

        2,nginx基础镜像

​
cd /opt/dockerfile/web/nginx
mkdir nginx-v1.22.0-base && cd nginx-v1.22.0-base 
   rz nginx-1.22.0.tar.gz



cat Dockerfile
FROM centos-base:v1
LABEL (作者信息)

ADD nginx-1.22.0.tar.gz /usr/local/src
RUN cd /usr/local/src/nginx-1.22.0/ && ./configure --prefix=/apps/nginx && make && make install && ln -sv /apps/nginx/sbin/nginx /usr/sbin && rm -rf /usr/local/src/nginx-1.22.0  && mkdir /data/nginx/html -p 

RUN groupadd nginx -g 2023 && useradd nginx -u 2023 -g nginx  -s /sbin/nologin 
RUN chown nginx.nginx /data/nginx  /apps/nginx
EXPOSE 80 443
CMD ["/apps/nginx/sbin/nginx","-g","daemon off;"]


cat build-command.sh
!#/bin/bash
docker build -t nginx-v1.22.0-base .



制作完成之后进入容器测试:
docker run -it --rm -p 80:80 nginx-v1.22.0-base bash

#ss -tnl


之后在浏览器进行验证

​

3,nginx业务镜像

​
cd /opt/dockerfile/web/nginx
mkdir nginx-web1 nginx-web2&& cd nginx-web1
  rz nginx.conf(优化和更改完成之后的配置文件)
  rz index.html.tar.gz



cat Dockerfile

FROM nginx-v1.22.0-base
ADD nginx.conf /apps/nginx/conf
ADD index.html.tar.gz /data/nginx/html

RUN chown -R nginx.nginx /apps/nginx
EXPOSE 80 443
CMD ["/apps/nginx/sbin/nginx","-g","daemon off;"]



cat build-command.sh
!#/bin/bash
docker build -t nginx-web1:v1 .

docker run -it --rm -p 80:80 nginx-web1:v1 
在容器例查看ss -tnl
在浏览器进行访问 

11,HAProxy镜像

​
docker pull centos
mkdir /opt/dockerfile/web/haproxy-centos -pv

cd /opt/dockerfile//haproxy-centos
  rz haproxy-2.0.15.tar.gz

cat Dockerfile

FROM centos-base:v1 (此处使用centos基础镜像)
LABEL 作者信息

RUN yum -y install vim-enhanced tcpdump lrzsz tree telnet bash-completion net-tools wget bzip2 lsof tmux man-pages zip unzip nfs-utils gcc make gcc-c++ glibc glibc-devel pcre pcre-devel openssl  openssl-devel systemd-devel zlib-devel

ADD haproxy-2.0.15.tar.gz /usr/local/src/

RUN cd /usr/local/src/haproxy-2.0.15 &&  make ARCH=x86_64 TARGET=linux2628 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_SYSTEMD=1 USE_CPU_AFFINITY=1 PREFIX=/usr/local/haproxy && make install PREFIX=/usr/local/haproxy && cp haproxy /usr/sbin/ && mkdir /usr/local/haproxy/run
ADD haproxy.cfg /etc/haproxy

ADD run_haproxy.sh /usr/bin/run_haproxy.sh
EXPOSE 80 9999
CMD ["/usr/bin/run_haproxy.sh"]



cat run_haproxy.sh
!#/bin/bash
/usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg
tail -f /etc/hosts
chmod +x run_haproxy.sh



cat haproxy.cfg(配置文件)
global
nbproc 1
pidfile /usr/local/haproxy/run/haproxy.pid
log 127.0.0.1 local3 info
 
defaults
option  http-keep-alive
option  forwardfor
mode http
timeout  connect 300000ms
timeout  client 300000ms
timeout  server 300000ms
     
listen stats
mode http    
bind 0.0.0.0:9999
stats enable
log global
stats uri /haproxy-status
stats auth  haadmin:admin

listen web-port
bind 0.0.0.0:80
mode http
log global
balance roundrobin
server web1 192.168.200.101:8080 check inter 3000 fall 3 rise 5
server web1 192.168.200.102:8080 check inter 3000 fall 3 rise 5



cat build-command.sh   通过脚本构建镜像
#!/bin/bahs
docker build -t haproxy:2.0.15-centos .

bash biuld-command.sh执行构建镜像

测试:docker run -it  -p 80:80 -p 9999:9999 haproxy:2.0.15-centos
ss -tnl

在浏览器访问ip:9999

12,docker-compose

简介:Docker compose是一种docker容器的任务编排工具
官方文档: https://docs.docker.com/compose/

1,命令简介:

docker compose的配置文件
 docker-compose.yml 只能是这个名称
 文件后缀是yml
 文件内容遵循 ymal格式


安装:apt install docker-compose -y
查看编排工具版本:docker-compose version
查看命令帮助:docker-compose --help

注意:
所有命令尽量都在docker compose项目目录下面进行操作
项目目录:docker-compose.yml所在目录

]# docker-compose --help
Define and run multi-container applications with Docker.
Usage:
docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
docker-compose -h|--help
Options: 选项参数
-f, --file FILE           指定配置文件,默认docker-compose.yml
-p, --project-name NAME  指定compose项目的文件目录
--verbose                显示更多信息
--log-level LEVEL         设置日志的级别 (DEBUG, INFO, WARNING, ERROR,
CRITICAL)
--no-ansi                不要打印ANSI控制字符
-v, --version            打印版本信息
-H, --host HOST           连接其他主机的docker-compose主机
--tls                    使用TLS;需要 --tlsverify 参数
--tlscacert CA_PATH      使用CA签名的信任证书
--tlscert CLIENT_CERT_PATH 指定CA证书的路径
--tlskey TLS_KEY_PATH    指定 私钥文件的路径
--tlsverify              使用TLS并验证远程
--skip-hostname-check    客户端连接的时候不要检查docker-compose的主机名
--project-directory PATH  指定项目的工作路径,默认是docker-compose.yaml文件所在路
径
--compatibility           如果设置,则Compose将尝试将v3文件中的密钥转换为其等效的非
Swarm密钥
--env-file PATH          设定专用环境变量路径


2,Commands: 操作子命令
build       Build or rebuild services
bundle       Generate a Docker bundle from the Compose file
config       Validate and view the Compose file
create       Create services
down        Stop and remove containers, networks, images, and volumes
events       Receive real time events from containers
exec        Execute a command in a running container
help        Get help on a command
images       List images
kill        Kill containers
logs        View output from containers
pause       Pause services
port        Print the public port for a port binding
ps         List containers
pull        Pull service images
push        Push service images
restart      Restart services
rm         Remove stopped containers
run        Run a one-off command
scale       Set number of containers for a service
start       Start services
stop        Stop services
top        Display the running processes
unpause      Unpause services
up         Create and start containers
version      Show the Docker-Compose version information



3,创建+启动服务:
docker-compose up [options] [--scale SERVICE=NUM...] [SERVICE...]
options:
 -d 在后台运行服务容器
 --quiet-pull 拉取时不打印进度信息
 --no-build 即使缺失服务镜像,也不自动构建缺失的服务镜像
 --build 启动容器前,先构建自有镜像
 --force-recreate    强制重建所有服务容器,即使配置不变动的时候.
 --always-recreate-deps 重新创建从属容器。 与--no-recreate不兼容。
 --no-recreate      如果容器已经存在,请不要重新创建它们。 与--force-
recreate和-V不兼容。
 –-scale SERVICE=NUM 设置服务运行容器的个数,将覆盖在compose中通过scale指定的
参数

示例:
]# docker-compose -f /data/compose/docker-compose.yml up -d 
Creating network "compose_default" with the default driver
Creating nginx-web1 ... done
Creating nginx-web2 ... done



4,关闭+移除服务:
关闭服务
docker-compose down [options]
Options:
 --rmi type     移除镜像,all代表所有,local仅删除没有在"image"字段中出现的
镜像。
 -v, --volumes 删除在Compose文件的“ volumes”部分中声明的命名卷和附加到容器
的匿名卷。
 --remove-orphans 删除未在"docker-compose.yaml"文件中定义的service的容
器
 -t, --timeout TIMEOUT 设置删除服务的超时时间,默认10s
注意:
如果不加任何参数,默认删除所有内容




5,创建一个服务
docker-compose create [options] [SERVICE...]
options
 --force-recreate
 --no-recreate
 --no-build
 --build
注意:
一般不推荐使用该命令,推荐使用 docker-compose up --no-start 来替代
create 默认不会创建网络配置,所以,我们一般不会在第一次创建服务时候使用,一般结合rm场景来
使用。

6,查看服务:
查看正在运行的服务
docker-compose ps [options] [SERVICE...]
options
 -q, --quiet     仅仅显示 IDs
 --services      显示指定的 services
 --filter KEY=VAL  显示匹配条件的services
 -a, --all      显示所有容器(即使已删除的容器)



7,启动服务
docker-compose start [SERVICE...]
注意:
如果不加任何参数,默认开启所有内容



8,查看服务运行的日志
docker-compose logs [options] [SERVICE...]
Options:
 --no-color     关闭颜色输出
 -f, --follow    实时显示所有日志
 -t, --timestamps  显示时间戳
 --tail="all"    显示日志的最优几条日志
命令示例
]# docker-compose logs web1
Attaching to nginx-web1



9,查看服务依赖的镜像
docke-compose images [options] [SERVICE...]
Options:
 -q, --quiet 仅仅显示 IDs
命令示例:
]# docker-compose images
Container  Repository  Tag    Image Id   Size
--------------------------------------------------------
nginx-web1  nginx    latest  ab56bba91343  120 MB
nginx-web2  nginx    latest  ab56bba91343  120 MB


10,查看服务映射的端口
docker-compose port [options] SERVICE PRIVATE_PORT
Options:
 --protocol=proto 设定服务的协议,默认是tcp
 --index=index   如果服务service存在多个容器,可以通过索引来指定显示谁的
命名示例
]# docker-compose port web1 80
0.0.0.0:9999



11,查看配置信息
docker-compose config [options]
Options:
 --resolve-image-digests 打印配置信息的时候,显示镜像的hash信息
 -q, --quiet       显示信息的时候,不输出
 --services        显示配置文件中的service记录
 --volumes        显示配置文件中的数据卷信息。
 --hash="*"        显示配置文件中的service及其加密信息
命令示例
]# docker-compose config --hash="web1"
web1 208dc2ec31d118e4acc045cb1d916e9ed7dfd0628f2f450a279458f344342cac
]# docker-compose config --service
web2
web1



12,关闭服务:
docker-compose stop [options] [SERVICE...]
Options:
-t, --timeout TIMEOUT   Specify a shutdown timeout in seconds. (default:
10)
注意:
如果不加任何参数,默认关闭所有内容



13,删除任务:
docker-compose rm [options] [SERVICE...]
Options:
 -f, --force  强制删除所有
 -s, --stop  正常方式删除服务,先关闭容器再移除
 -v     删除附加到容器的所有匿名卷
 -a, --all   不推荐使用
注意:
这个docker-compose rm默认不会删除应用的网络和数据卷。







配置示例文件
mkdir /data/compose
cd /data/compose
vim docker-compose.yml

docker-compose.yml 文件内容
version: '2'
services:
web1:
 image: nginx
 ports:
  - "9999:80"
 container_name: nginx-web1
web2:
 image: nginx
 ports:
  - "8888:80"
 container_name: nginx-web2


启动配置:
后台启动
docker-compose up -d
注意:
如果不加-d,那么界面就会卡在前台
查看运行效果
docker-compose ps


13,haubor仓库 

阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台

Harbor (goharbor.io)https://goharbor.io/GitHub - goharbor/harbor: An open source trusted cloud native registry project that stores, signs, and scans content.An open source trusted cloud native registry project that stores, signs, and scans content. - GitHub - goharbor/harbor: An open source trusted cloud native registry project that stores, signs, and scans content.https://github.com/goharbor/harbor/

环境部署:
下载软件
cd /data/softs
wget https://github.com/goharbor/harbor/releases/download/v2.5.0/harbor-offline-
installer-v2.5.0.tgz

解压软件
tar -zxvf harbor-offline-installer-v2.5.0.tgz -C /usr/local/
cd /usr/local/harbor/

加载镜像
docker load < harbor.v2.5.0.tar.gz
docker images


备份配置
cp harbor.yml.tmpl harbor.yml

修改配置
 hostname: 10.0.0.12
 http:
  port: 80
 #https: 注释ssl相关的部分
  # port: 443
  # certificate: /your/certificate/path
  # private_key: /your/private/key/path
 harbor_admin_password: 123456
 data_volume: /data/harbor

配置harbor
./prepare
注意:
这一步会生成专用的 docker-compose.yml 文件
启动harbor
./install.sh


检查效果
docker-compose ps
浏览器访问地址 浏览器访问 10.0.0.12:80 地址,用户名: admin, 密码:123456

systemd启动
# vim /lib/systemd/system/harbor.service
[Unit]
Description=Harbor
After=docker.service systemd-networkd.service systemd-resolved.service
Requires=docker.service
Documentation=http://github.com/vmware/harbor
[Service]
Type=simple
Restart=on-failure
RestartSec=5
#需要注意harbor的安装位置
ExecStart=/usr/bin/docker-compose --file /usr/local/harbor/docker-compose.yml
up
ExecStop=/usr/bin/docker-compose --file /usr/local/harbor/docker-compose.yml
down
[Install]
WantedBy=multi-user.target
加载服务配置文件
systemctl daemon-reload
systemctl start harbor
systemctl status harbor
systemctl enable harbor


仓库测试
修改docker的不安全仓库
# cat /etc/docker/daemon.json
{"registry-mirrors": ["http://74f21445.m.daocloud.io"], "insecure-registries":
["10.0.0.12:80"]}
重启docker
systemctl restart docker
检查效果
# docker info | grep -A1 Insecure
nsecure Registries:
10.0.0.19
登录仓库
root@python-auto:~# docker login 10.0.0.12:80
Username: sswang
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
提交实践
docker tag goharbor/nginx-photon:v2.3.2 10.0.0.12:80/sswang/nginx-photon:v2.3.2
docker push 10.0.0.12:80/sswang/nginx-photon:v2.3.2
注意:
提交的代码仓库必须在对应的账号里面存在,否则无法提交
因为默认情况下docker仓库是基于https方式来进行登录的,而我们的没有定制https所以,这里的仓
库地址必须是 ip:port 方式
下载实践
docker pull 10.0.0.12:80/sswang/nginx-photon:v2.3.2

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值