docker安装
官网在线安装
官网说明
https://docs.docker.com/engine/install/centos/
#卸载旧版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
#配置docker源
sudo yum install -y yum-utils
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
#选择启用对于的版本 --disable是禁用 --enable是启用
sudo yum-config-manager --disable docker-ce-nightly #每夜更新
sudo yum-config-manager --disable docker-ce-test #测试版本
#查询有哪些可用版本
yum list docker-ce --showduplicates | sort -r
#直接安装最新版本docker
yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
#安装指定版本docker
yum -y install docker-ce-19.03.15 docker-ce-cli-19.03.15 containerd.io docker-compose-plugin
阿里云在线安装
# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# Step 4: 更新并安装Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
# Step 4: 开启Docker服务
systemctl enable docker.service
systemctl start docker
systemctl status docker
# 注意:
# 官方软件源默认启用了最新的软件,您可以通过编辑软件源的方式获取各个版本的软件包。例如官方并没有将测试版本的软件源置为可用,您可以通过以下方式开启。同理可以开启各种测试版本等。
# vim /etc/yum.repos.d/docker-ce.repo
# 将[docker-ce-test]下方的enabled=0修改为enabled=1
#
# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# yum list docker-ce.x86_64 --showduplicates | sort -r
# Loading mirror speeds from cached hostfile
# Loaded plugins: branch, fastestmirror, langpacks
# docker-ce.x86_64 17.03.1.ce-1.el7.centos docker-ce-stable
# docker-ce.x86_64 17.03.1.ce-1.el7.centos @docker-ce-stable
# docker-ce.x86_64 17.03.0.ce-1.el7.centos docker-ce-stable
# Available Packages
# Step2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.0.ce.1-1.el7.centos)
# sudo yum -y install docker-ce-[VERSION]
#直接下载不安装最新版本的docker
mkdir -p /root/docker
yum -y install --downloadonly --downloaddir=/root/docker docker-ce docker-ce-cli containerd.io docker-compose-plugin
#只下载指定版本不安装
yum -y install --downloadonly --downloaddir=/root/docker docker-ce-19.03.15 docker-ce-cli-19.03.15 containerd.io docker-compose-plugin
yum -y install --downloadonly --downloaddir=/root/docker docker-ce-20.10.21 docker-ce-cli-20.10.21 containerd.io docker-compose-plugin
万能在线安装
curl -fsSL "https://get.docker.com/" | sh
不管是在 Ubuntu 或 CentOS 都只需要执行该指令就会自动安装最新版 Docker。
CentOS 安装完成后,需要再执行以下指令:
systemctl enable docker && systemctl start docker
在线安装二进制安装
二进制下载地址
https://download.docker.com/linux/static/stable/x86_64/
#下载 --progress显示进度条
banbenhao=19.03.9
curl -o /root/docker-$banbenhao.tgz https://download.docker.com/linux/static/stable/x86_64/docker-19.03.9.tgz --progress
#解压
tar zxvf /root/docker-$banbenhao.tgz
#复制启动文件
cp docker/* /usr/bin
chmod 755 /usr/bin/{containerd,containerd-shim,ctr,docker,dockerd,docker-init,docker-proxy,runc}
#systemd管理docker
cat > /usr/lib/systemd/system/docker.service << EOF
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=simple
ExecStart=/usr/bin/dockerd
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
EOF
docker基础命令
服务启停
#版本查看
docker -v
docker info
docker version
#服务启停
systemctl daemon-reload
systemctl start docker
systemctl stop docker
systemctl enable docker
systemctl status docker
systemctl restart docker
镜像操作
查看镜像
#查显示镜像的历史
docker history nginx
#列出本地镜像
docker image ls
docker images
#查找某个镜像
docker search nginx
拉取镜像
#拉取镜像 下载镜像并指定版本号,如果不带版本号就默认下载最新的版本
docker pull nginx:1.19.0
docker pull centos:7
docker pull nginx
删除镜像
#注意:删除镜像 删除镜像 如果提示镜像被容器占用,就先删除容器,在回来删除镜像
#删除nginx镜像
docker rmi nginx
docker rmi 4cdd89a08f65
#删除镜像为none的
docker image prune -f
#删除为 none 的镜像
docker rmi [-f] $(docker images | grep "none" | awk '{print $3}')
docker images prune #移除没有被标记或者没有被任何容器引用的镜像
docker images prune -a #加-a的话会移除所有没有和容器关联的镜像
导出镜像
普通方式导出
#原镜像名字
calico/node v3.20.0 5ef66b403f4f 15 months ago 170MB
calico/pod2daemon-flexvol v3.20.0 5991877ebc11 15 months ago 21.7MB
calico/cni v3.20.0 4945b742b8e6 15 months ago 146MB
calico/kube-controllers v3.20.0 76ba70f4748f 15 months ago 63.2MB
#导出镜像 打包到本地下载 -o 后面是另存的文件名
docker save 5ef66b403f4f -o calico-node-3.20.0.tar
docker save 5991877ebc11 -o calico-pod2daemon-flexvol-3.20.0.tar
docker save 4945b742b8e6 -o calico-cni-3.20.0.tar
docker save 76ba70f4748f -o calico-kube-controllers-3.20.0.tar
#方式2 999c20aee5da为镜像ID
docker save 999c20aee5da > /home/artipub.tar
脚本导出
#!/bin/bash
set -e
read -p '请输入你要打包的个数:' sum
for i in $(seq $sum)
do
read -p '请输入你要打包的镜像ID(一次输入一个):' images1
docker images | grep $images1
if [ $? == 0 ];then
images2=`docker images | grep $images1 | awk '{print $1}' | awk -F'/' '{print $NF}'`
images3=`docker images | grep $images1 | awk '{print $3}'`
echo "你要打包的镜像tar包将用的名字是$images2.tar,打包的镜像ID是$images3"
docker save -o $images2.tar $images3
else
echo "没有该镜像"
exit
fi
done
镜像导入
步骤1:load加载本地镜像
docker load -i calico-node-3.20.0.tar
docker load -i calico-pod2daemon-flexvol-3.20.0.tar
docker load -i calico-cni-3.20.0.tar
docker load -i calico-kube-controllers-3.20.0.tar
k8s中节点必须导入这三个镜像
docker load -i pause.tar
docker load -i kube-proxy.tar
docker load -i calico-cni-3.20.0.tar
![图片[1]-docker-秋风落叶](https://wangjian.run/wp-content/uploads/2022/11/image-12.png)
注意:导入的镜像是没有标签的,需要打个标签
![图片[2]-docker-秋风落叶](https://wangjian.run/wp-content/uploads/2022/11/image-11.png)
步骤2:打标签
docker tag 5ef66b403f4f wj/calico/node:v3.20.0
docker tag 5991877ebc11 wj/calico/pod2daemon-flexvol:v3.20.0
docker tag 4945b742b8e6 wj/calico/cni:v3.20.0
docker tag 76ba70f4748f wj/calico/kube-controllers:v3.20.0
镜像ID 仓库名称 包名 版本号
再次查看镜像信息
![图片[3]-docker-秋风落叶](https://wangjian.run/wp-content/uploads/2022/11/image-13.png)
步骤4:推送镜像到仓库
#推送到默认仓库
docker push nginx
#推送到指定仓库
docker push 192.168.60.132:80/library/etcd:3.5.1-0
仓库地址 包名 版本号
容器操作
查询容器
docker ps -a #查看所有的容器,包括未运行的容器
docker ps #查看正在运行的容器
docker ps -q #只查看正在运行的容器的ID
docker ps -qa #只查看包含未运行的
docker ps -a -l #列出最新的容器显示容器大小
docker port 容器ID #查看容器端口
docker top 容器ID #查看容器运行的进程
docker stats 容器ID 或者 docker stats 容器ID --no-stream #查看容器资源利用率
docker inspect 容器ID #查看容器的层次结构
启停容器
######启动新的容器
docker run -ti centos:8 bash #前台启动
docker run -d -p 8080:80 nginx #后台启动
docker run --name tomcat2 -d -p 8081:8080 tomcat
docker run --name tomcat1 -d tomcat:1.0
docker run -ti --rm centos:user bash #临时运行 测试的时候用 --rm
参数解释:
-d 后台启动
--name 是起一个名字叫做tomcat2
tomcat是指使用哪个镜像启动的容器
-p是端口映射把tomcat 8080端口映射到本机8081端口
1.0代表 镜像的哪个版本,如果不写 ,代表是最新的版本
-ti 重新打开一个终端窗口
##########启动已存在的容器
docker start 容器ID
#重启容器
docker restart 容器ID
#停止容器
docker stop 容器ID
docker stop $(docker ps -a -q) #停止所有容器
#其他设置命令
docker run -m=”500M” --cpus=”1”-d nginx #限制容器启动大小
docker run -d -p 8080:80 --restart=always nginx #容器开机自启
登陆容器
docker exec -it 容器ID /bin/bash #进入容器里面 ID后面有空格
docker exec -it (容器ID) /run.sh #进去容器里面后,直接执行/run.sh
docker exec 容器ID pwd #在容器里面执行pwd命令
删除容器
docker rm 容器ID
docker rm -f ID
docker rm -f $(docker ps -a -q) #删除所有容器
docker container prune #移除所有已停止的容器
容器日志查看
docker logs -f 容器ID #参看容器日志位置:/var/lib/docker/containers
容器文件拷贝
docker cp 容器id:/opt/1.txt /home #从容器复制到本地
docker cp xxx.jar 容器id:/opt/ #从本地复制到容器
数据持久化
三种方式
- Volumes: Docker 管理宿主机文件系统的一部分(/var/lib/docker/volumes)。保存数据的最佳方式。
- Bind mounts: 将宿主机的任意位置的文件或者目录挂载到容器中。
- tmpfs:挂载存储在主机系统的内存中,而不会写入主机的文件系统。如果不希望将数据持久存储在任何位置,可以使用tmps,同时避免写入容器可写层提高性能。
volume是Docker官方推荐的持久化方案,默认情况下,volume的存储空间来自于宿主机文件系统中的某个目录,如/var/lib/docker/volumes/,docker系统外的程序无权限修改其中的数据。
一个volume可以同时供多个container使用,如果没有container使用volume,其不会自动删除,用户需运行docker volume prune明确删除。
如果用户显式创建volume,则需要给其指定一个名称;如果是隐式创建volume,Docker会自动为其分配一个在宿主机范围内唯一的名字。
如果容器中的目录不存在,docker会自动创建目录;如果容器中的目录已有内容,docker会使用宿主机上目录的内容覆盖容器目录的内容。
#查看volume信息
docker volume ls
#查看volume信息
[root@localhost volumes]# pwd
/var/lib/docker/volumes
[root@localhost volumes]# ls
backingFsBlockDev for_nginx metadata.db
[root@localhost volumes]#
# 创建volume数据卷
docker volume create for_nginx
#运行容器并挂载(nginx为例
docker run --name wjnginx -d -p 80:80 --mount type=volume,source=for_nginx,target=/usr/share/nginx/html nginx:1.24.0
运行完容器后,会在本机相应的目录中会将容器内相关目录中的文件挂载出来
[root@localhost _data]# pwd
/var/lib/docker/volumes/for_nginx/_data
[root@localhost _data]# ls
50x.html index.html
出现以上文件说明,数据挂载且启动成功
#在宿主机测试验证
修改/var/lib/docker/volumes/for_nginx/_data/index.html 文件,访问地址看是否有变化
echo "ci shi nginx" > /var/lib/docker/volumes/for_nginx/_data/index.html
[root@localhost _data]# curl http://192.168.70.150
ci shi nginx
验证成功
#容器测试验证
# 进入容器内部
docker exec -it 84608669dfc0 /bin/bash
echo "ci shi nginx123" > /usr/share/nginx/html/index.html
[root@localhost ~]# curl http://192.168.70.150
ci shi nginx123
验证成功
参考的教程:https://www.cnblogs.com/smj-7038/p/17021195.html
总结
volumes:
- 需要创建docker volume,docker volume的存储是在docker安装目录内,卸载docker会丢失。
- 创建容器时会将容器内文件映射到docker volume的相应目录上,并且不管宿主机还是容器内操作挂载目录中的文件都是互通的。
- 多个运行容器间共享数据,备份、恢复、或将数据从一个Docker主机迁移到另一个Docker主机时。
bind mount:
- 需要手动在宿主机上创建挂载的目录(或者利用现有的),数据直接存在了宿主机硬盘上,删除容器或者卸载docker,数据并不会消失。
- 创建容器时,会将宿主机上目录上的文件覆盖容器内的相应目录,所以此方法挂载需要预先将容器内相应被挂载目录的文件复制出来。
- 主机与容器共享配置文件(Docker默认情况下通过这种方式为容器提供DNS解析,通过将/etc/resolv.conf挂载到容器中)
- 命令有简写的 -v 方式。
tmpfs mount:
- 既不想将数据存于主机,又不想存于容器中时(这可以是出于安全的考虑,或当应用需要写大量非持久性的状态数据时为了保护容器的性能)。
docker镜像源修改
查看镜像源
[root@k8s-master ~]# docker info
#查看最后的值:
Registry Mirrors:
https://b9pmyelo.mirror.aliyuncs.com/
https://docker.mirrors.ustc.edu.cn/
http://hub-mirror.c.163.com/
Live Restore Enabled: false
如果为空,则表示没有配置,使用的是官方的镜像源
添加新的镜像源
cat > /etc/docker/daemon.json << EOF
{
"exec-opts":["native.cgroupdriver=systemd"],"registry-mirrors":["https://b9pmyelo.mirror.aliyuncs.com","https://docker.mirrors.ustc.edu.cn","http://hub-mirror.c.163.com"],"insecure-registries":["192.168.60.132:80"]
}
EOF
备注:
registry-mirrors:可以添加多个镜像源
insecure-registries:添加habor仓库地址
exec-opts:修改驱动
#查看驱动是否修改
docker info | grep cgroup
重启docker
systemctl daemon-reload
systemctl restart docker
systemctl status docker
k8s1.19.0相关镜像一键导入打标签
方案1还是用阿里的镜像名字
docker load -i calico-node-3.20.0.tar
docker load -i calico-pod2daemon-flexvol-3.20.0.tar
docker load -i calico-cni-3.20.0.tar
docker load -i calico-kube-controllers-3.20.0.tar
docker tag 5ef66b403f4f wj/calico/node:v3.20.0
docker tag 5991877ebc11 wj/calico/pod2daemon-flexvol:v3.20.0
docker tag 4945b742b8e6 wj/calico/cni:v3.20.0
docker tag 76ba70f4748f wj/calico/kube-controllers:v3.20.0
docker load -i coredns-1.7.0.tar
docker load -i etcd-3.4.9-1.tar
docker load -i kube-apiserver-1.19.0.tar
docker load -i kube-controller-manager-1.19.0.tar
docker load -i kube-proxy-1.19.0.tar
docker load -i kube-scheduler-1.19.0.tar
docker load -i pause-3.2.tar
docker tag bfe3a36ebd25 registry.aliyuncs.com/google_containers/coredns:1.7.0
docker tag d4ca8726196c registry.aliyuncs.com/google_containers/etcd:3.4.9-1
docker tag 1b74e93ece2f registry.aliyuncs.com/google_containers/kube-apiserver:v1.19.0
docker tag 09d665d529d0 registry.aliyuncs.com/google_containers/kube-controller-manager:v1.19.0
docker tag bc9c328f379c registry.aliyuncs.com/google_containers/kube-proxy:v1.19.0
docker tag cbdc8369d8b1 registry.aliyuncs.com/google_containers/kube-scheduler:v1.19.0
docker tag 80d28bedfe5d registry.aliyuncs.com/google_containers/pause:3.2
方案2把阿里的拿来的镜像名字修改为自己的,有自己的镜像仓库
docker load -i calico-node-3.20.0.tar
docker load -i calico-pod2daemon-flexvol-3.20.0.tar
docker load -i calico-cni-3.20.0.tar
docker load -i calico-kube-controllers-3.20.0.tar
docker tag 5ef66b403f4f wj/calico/node:v3.20.0
docker tag 5991877ebc11 wj/calico/pod2daemon-flexvol:v3.20.0
docker tag 4945b742b8e6 wj/calico/cni:v3.20.0
docker tag 76ba70f4748f wj/calico/kube-controllers:v3.20.0
docker load -i coredns-1.7.0.tar
docker load -i etcd-3.4.9-1.tar
docker load -i kube-apiserver-1.19.0.tar
docker load -i kube-controller-manager-1.19.0.tar
docker load -i kube-proxy-1.19.0.tar
docker load -i kube-scheduler-1.19.0.tar
docker load -i pause-3.2.tar
docker tag bfe3a36ebd25 wj/coredns:1.7.0
docker tag d4ca8726196c wj/etcd:3.4.9-1
docker tag 1b74e93ece2f wj/kube-apiserver:v1.19.0
docker tag 09d665d529d0 wj/kube-controller-manager:v1.19.0
docker tag bc9c328f379c wj/kube-proxy:v1.19.0
docker tag cbdc8369d8b1 wj/kube-scheduler:v1.19.0
docker tag 80d28bedfe5d wj/pause:3.2
dashboardv2.0.0-beta8镜像导入
docker pull kubernetesui/metrics-scraper:v1.0.1
docker pull kubernetesui/dashboard:v2.0.0-beta8
[root@k8s-master1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
kubernetesui/dashboard v2.0.0-beta8 eb51a3597525 2 years ago 90.8MB
kubernetesui/metrics-scraper v1.0.1 709901356c11 3 years ago 40.1MB
docker load -i dashboard.tar
docker load -i metrics-scraper.tar
docker tag eb51a3597525 kubernetesui/dashboard:v2.0.0-beta8
docker tag 709901356c11 kubernetesui/metrics-scraper:v1.0.1
nginx镜像
[root@k8s-master1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx 1.19.0 2622e6cca7eb 2 years ago 132MB
docker save 2622e6cca7eb -o nginx-1.19.0.tar
docker load -i nginx-1.19.0.tar
docker tag 2622e6cca7eb nginx:1.19.0
harbor2.0.0镜像导入
[root@k8s-node1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
goharbor/chartmuseum-photon v2.0.0 4db8d6aa63e9 2 years ago 127MB
goharbor/redis-photon v2.0.0 c89ea2e53cc0 2 years ago 72.2MB
goharbor/trivy-adapter-photon v2.0.0 6122c52b7e48 2 years ago 103MB
goharbor/clair-adapter-photon v2.0.0 dd2210cb7f53 2 years ago 62MB
goharbor/clair-photon v2.0.0 f7c7fcc52278 2 years ago 171MB
goharbor/notary-server-photon v2.0.0 983ac10ed8be 2 years ago 143MB
goharbor/notary-signer-photon v2.0.0 bee1b6d75e0d 2 years ago 140MB
goharbor/harbor-registryctl v2.0.0 c53c32d58d04 2 years ago 102MB
goharbor/registry-photon v2.0.0 afdc1b7ada36 2 years ago 84.5MB
goharbor/nginx-photon v2.0.0 17892f03e56c 2 years ago 43.6MB
goharbor/harbor-log v2.0.0 5f8ff08e795c 2 years ago 82MB
goharbor/harbor-jobservice v2.0.0 c68a2495bf55 2 years ago 116MB
goharbor/harbor-core v2.0.0 3aa3af64baf8 2 years ago 138MB
goharbor/harbor-portal v2.0.0 e0b1d3c894c4 2 years ago 52.4MB
goharbor/harbor-db v2.0.0 5c76f0296cec 2 years ago 154MB
goharbor/prepare v2.0.0 7266d49995ed 2 years ago 158MB
mysql
[root@k8s-master1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7 c20987f18b13 10 months ago 448MB
tomcat
[root@k8s-master1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat 8.5.83 036850cd208d 6 days ago 474MB
Dockerfile
基础命令
#查看镜像构建过程
docker history nginx:latest
Dockerfile 参数解释
Dockerfile一般包含下面几个部分:
- 基础镜像:以哪个镜像作为基础进行制作,用法是
FROM 基础镜像名称
- 维护者信息:需要写下该Dockerfile编写人的姓名或邮箱,用法是
MANITAINER 名字/邮箱
- 镜像操作命令:对基础镜像要进行的改造命令,比如安装新的软件,进行哪些特殊配置等,常见的是
RUN 命令
- 容器启动命令:当基于该镜像的容器启动时需要执行哪些命令,常见的是
CMD 命令
或ENTRYPOINT
ARG—— 定义创建镜像过程中使用的变量 ,唯一一个可以在 FROM 之前定义 。
FROM——基于某个镜像, FROM前面只能有一个或多个ARG指令 。
MAINTAINER(已弃用) —— 镜像维护者姓名或邮箱地址 。
VOLUME —— 指定容器挂载点到宿主机自动生成的目录或其他容器
RUN——执行镜像里的命令,跟在 liunx 执行命令一样,只需要在前面加上 RUN 关键词就行。
COPY——复制本地(宿主机)上的文件到镜像。
ADD——复制并解压(宿主机)上的压缩文件到镜像。
ENV——设置环境变量。
WORKDIR —— 为 RUN、CMD、ENTRYPOINT、COPY 和 ADD 设置工作目录,就是切换目录 。
USER —— 为 RUN、CMD、和 ENTRYPOINT 执行命令指定运行用户。
EXPOSE —— 声明容器的服务端口(仅仅是声明) 。
CMD—— 容器启动后执行的命令 ,多个 CMD 只会执行最后一个,跟 ENTRYPOINT 的区别是,CMD 可以作为 ENTRYPOINT 的参数,且会被 yaml 文件里的 command 覆盖。
ENTRYPOINT—— 容器启动后执行的命令 ,多个只会执行最后一个。 #类似cmd,但这个命令不会被docker run后面的命令所覆盖,而是把这些命令参数传给ENTRYPOINT指令指定的程序,也是最后一个生效
HEALTHCHECH —— 健康检查 。
ONBUILD——它后面跟的是其它指令,比如 RUN, COPY 等,而这些指令,在当前镜像构建时并不会被执行。只有当以当前镜像为基础镜像,去构建下一级镜像的时候才会被执行。
LABEL——LABEL 指令用来给镜像添加一些元数据(metadata),以键值对的形式 ,替换 MAINTAINER。
1)镜像构建(docker build)
docker build -t text:v1 . --no-cache
# 要在构建后将映像标记到多个存储库中,请在运行命令-t时添加多个参数
docker build -t shykes/myapp:1.0.2 -t shykes/myapp:latest .
### 参数解释
# -t:指定镜像名称
# . :当前目录Dockerfile
# -f:指定Dockerfile路径
# --no-cache:不缓存
2)运行容器测试(docker run)
# 非交互式运行
docker run centos:7.4.1708 /bin/echo "Hello world"
### 交互式执行
# -t: 在新容器内指定一个伪终端或终端。
#-i: 允许你对容器内的标准输入 (STDIN) 进行交互。
# 会登录到docker环境中,交互式
docker run -it centos:7.4.1708 /bin/bash
# -d:后台执行,加了 -d 参数默认不会进入容器
docker run -itd centos:7.4.1708 /bin/bash
### 进入容器
# 在使用 -d 参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入:
#docker exec -it :推荐大家使用 docker exec -it 命令,因为此命令会退出容器终端,但不会导致容器的停止。
#docker attach:容器退出,会导致容器的停止。
docker exec -it b2c0235dc53 /bin/bash
docker attach b2c0235dc53
3)ARG
构建参数,与 ENV 作用一致。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量。唯一一个可以在 FROM 之前定义 。构建命令 docker build 中可以用 --build-arg <参数名>=<值> 来覆盖。
# 在FROM之前定义ARG,只在 FROM 中生效
ARG VERSION=laster
FROM centos:${VERSION}
# 在FROM之后使用,得重新定义,不需要赋值
ARG VERSION
RUN echo $VERSION >/tmp/image_version
ARG VERSION=latest
FROM busybox:$VERSION
# FROM --platform="linux/amd64" busybox:$VERSION
ARG VERSION
RUN echo $VERSION > image_version
5)MAINTAINER(已弃用)
MAINTAINER <name> (已弃用)
LABEL org.opencontainers.image.authors="SvenDowideit@home.org.au"
6)VOLUME
定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。
作用:
避免重要的数据,因容器重启而丢失,这是非常致命的。
避免容器不断变大。
在启动容器 docker run 的时候,我们可以通过 -v 参数修改挂载点。
FROM ubuntu
RUN mkdir /myvol
RUN echo "hello world" > /myvol/greeting
VOLUME /myvol
7)RUN
用于执行后面跟着的命令行命令。
# 以下三种写法等价
RUN /bin/bash -c 'source $HOME/.bashrc; \
echo $HOME'
RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME'
RUN ["/bin/bash", "-c", "source $HOME/.bashrc; echo $HOME"]
8)COPY
拷贝(宿主机)文件或目录到容器中,跟 ADD 类似,但不具备自动下载或解压的功能 。所有新文件和目录都使用 0 的 UID 和 GID 创建,除非可选--chown标志指定给定的用户名、组名或 UID/GID 组合以请求复制内容的特定所有权。
示例:
# 添加所有以“hom”开头的文件:
COPY hom* /mydir/
# ?替换为任何单个字符,例如“home.txt”。
COPY hom?.txt /mydir/
# 使用相对路径,并将“test.txt”添加到<WORKDIR>/relativeDir/:
COPY test.txt relativeDir/
# 使用绝对路径,并将“test.txt”添加到/absoluteDir/
COPY test.txt /absoluteDir/
# 修改文件权限
COPY --chown=55:mygroup files* /somedir/
COPY --chown=bin files* /somedir/
COPY --chown=1 files* /somedir/
COPY --chown=10:11 files* /somedir/
9)ADD
拷贝文件或目录到容器中,如果是 URL 或压缩包便会自动下载或自动解压 。
ADD 指令和 COPY 的使用格类似(同样需求下,官方推荐使用 COPY)。功能也类似,不同之处如下:
ADD 的优点:在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。
ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。
示例:
# 通配符
ADD hom* /mydir/
# 相对路径,拷贝到WORKDIR目录下relativeDir/
ADD test.txt relativeDir/
# 绝对路径
ADD test.txt /absoluteDir/
# 更改权限
ADD --chown=55:mygroup files* /somedir/
ADD --chown=bin files* /somedir/
ADD --chown=1 files* /somedir/
ADD --chown=10:11 files* /somedir/
ADD 和 COPY 的区别和使用场景:
ADD 支持添加远程 url 和自动提取压缩格式的文件,COPY 只允许从本机中复制文件
COPY 支持从其他构建阶段中复制源文件(--from)
根据官方 Dockerfile 最佳实践,除非真的需要从远程 url 添加文件或自动提取压缩文件才用 ADD,其他情况一律使用 COPY
10)ENV
设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。
示例:
ENV JAVA_HOME=/usr/local/jdk
ENV MY_NAME="John Doe" MY_DOG=Rex\ The\ Dog \
MY_CAT=fluffy
# 此语法不允许在单个ENV指令中设置多个环境变量,并且可能会造成混淆。
ENV JAVA_HOME /usr/local/jdk
11)WORKDIR
指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。(WORKDIR 指定的工作目录,必须是提前创建好的)。
示例:
FROM busybox
ENV FOO=/bar
WORKDIR ${FOO} # WORKDIR /bar
12)USER
用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户(用户和用户组必须提前已经存在)。
示例:
FROM busybox
RUN groupadd --system --gid=9999 admin && useradd --system --home-dir /home/admin --uid=9999 --gid=admin admin
USER admin:admin
# USER 9999:9999
13)EXPOSE
暴露端口 ,仅仅只是声明端口。
作用:
帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。
在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。
EXPOSE 80/TCP 443/TCP
EXPOSE 80 443
EXPOSE 80/tcp
EXPOSE 80/udp
14)CMD
类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:CMD 在构建镜像时不会执行,在容器运行 时运行。
推荐使用第二种格式,执行过程比较明确。第一种格式实际上在运行的过程中也会自动转换成第二种格式运行,并且默认可执行文件是 sh。
CMD cat /etc/profile
CMD ["/bin/sh","-c","/etc/profile"]
注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。
15)ENTRYPOINT
类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。但是, 如果运行 docker run 时使用了 --entrypoint 选项,将覆盖 ENTRYPOINT 指令指定的程序。在 k8s 中 command 也会覆盖 ENTRYPOINT 指令指定的程序
示例:
FROM ubuntu
ENTRYPOINT ["top", "-b"]
# CMD作为ENTRYPOINT参数
CMD ["-c"]
# 与下面的等价
ENTRYPOINT ["top", "-b -c"]
ENTRYPOINT top -b -c
注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。
16)HEALTHCHECK
用于指定某个程序或者指令来监控 docker 容器服务的运行状态。
语法格式:
HEALTHCHECK [OPTIONS] CMD command(通过在容器内运行命令检查容器运行状况)
HEALTHCHECK NONE(禁用从基础映像继承的任何运行状况检查)
选项CMD有:
--interval=DURATION(默认30s:):间隔,频率
--timeout=DURATION(默认30s:):超时时间
--start-period=DURATION(默认0s:):为需要时间引导的容器提供初始化时间, 在此期间探测失败将不计入最大重试次数。
--retries=N(默认3:):重试次数
命令的exit status指示容器的运行状况。可能的值为:
0:健康状态,容器健康且已准备完成。
1:不健康状态,容器工作不正常。
2:保留,不要使用此退出代码。
示例:
FROM nginx
MAINTAINER Securitit
HEALTHCHECK --interval=5s --timeout=3s \
CMD curl -f http://localhost/ || exit 1
CMD ["usr/sbin/nginx", "-g", "daemon off;"]
17)ONBUILD
ONBUILD 是一个特殊的指令,它后面跟的是其它指令,比如 RUN, COPY 等,而这些指令,在当前镜像构建时并不会被执行。只有当以当前镜像为基础镜像,去构建下一级镜像的时候才会被执行。
示例:
FROM node:slim
RUN mkdir /app
WORKDIR /app
ONBUILD COPY ./package.json /app
ONBUILD RUN [ "npm", "install" ]
ONBUILD COPY . /app/
CMD [ "npm", "start" ]
18)LABEL
LABEL 指令用来给镜像添加一些元数据(metadata),以键值对的形式。用来替代 MAINTAINER。
示例:比如我们可以添加镜像的作者
LABEL org.opencontainers.image.authors="runoob"
ARG 和 ENV 的区别
ARG 定义的变量只会存在于镜像构建过程,启动容器后并不保留这些变量
ENV 定义的变量在启动容器后仍然保留
开始制作nginx镜像
首先,需要创建一个目录来存放 Dockerfile 文件,目录名称可以任意,在目录里创建Dockerfile文件
简单版本
#编写文件
[root@localhost 0828]# vim Dockerfile
FROM nginx
MAINTAINER 秋风落叶
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
#构建镜像
[root@localhost 0828]# docker build -t nginx:v1 .
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM nginx
latest: Pulling from library/nginx
52d2b7f179e3: Pull complete
fd9f026c6310: Pull complete
055fa98b4363: Pull complete
96576293dd29: Pull complete
a7c4092be904: Pull complete
e3b6889c8954: Pull complete
da761d9a302b: Pull complete
Digest: sha256:104c7c5c54f2685f0f46f3be607ce60da7085da3eaa5ad22d3d9f01594295e9c
Status: Downloaded newer image for nginx:latest
---> eea7b3dcba7e
Step 2/2 : RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
---> Running in 98c7c367aa74
Removing intermediate container 98c7c367aa74
---> f6efde29c32a
Successfully built f6efde29c32a
Successfully tagged nginx:v1
#运行
[root@localhost 0828]# docker run -d -p 8080:80 nginx:v1
06316e5e5333ab526489dccd320a81529975a9d124550c173054f5212d8b614e
[root@localhost 0828]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
06316e5e5333 nginx:v1 "/docker-entrypoint.…" 9 seconds ago Up 7 seconds 0.0.0.0:8080->80/tcp, :::8080->80/tcp objective_hamilton
[root@localhost 0828]# curl http://192.168.70.151:8080/
<h1>Hello, Docker!</h1>
mkdir -p /root/wj/nginxceshi && cd /root/wj/nginxceshi/ && vim Dockerfile
FROM centos:centos7
MAINTAINER wangjian.run
WORKDIR /root/
ADD nginx-1.20.2-1.el7.ngx.x86_64.rpm /root/
RUN yum -y install openssl*
RUN rpm -ivh nginx-1.20.2-1.el7.ngx.x86_64.rpm && rm -rf nginx-1.20.2-1.el7.ngx.x86_64.rpm
RUN echo "docker nginx 20230825 ...." > /usr/share/nginx/html/index.html
EXPOSE 80
CMD echo "success ------ok"
CMD /bin/bash
#开始构建
docker build -t wj-nginx:0.1 .
#运行测试
docker run -d -p 8080:80 wj-nginx:0.1
测试
试一下
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容