目录
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