Docker 是完整的一套容器管理系统,所以想要搞懂 Docker 的概念,我们必须先从容器开始说
起。什么是容器?
容器技术的核心,由以下几个内核技术组成:
查看linux系统的内核版本,【uname -r】也可以
[root@liruilong ~]# systemctl daemon-reload
[root@liruilong ~]# systemctl restart docker
镜像是启动容器的核心,在Docker 中容器是基于镜像启动的,镜像采用分层设计,使用COW技术
镜像可以从官方镜像仓库下载,也可以自己制作
[root@kube-node1 ~]$ docker save docker.io/busybox:latest -o /root/busybox.tar
[root@kube-node1 ~]$ scp /root/busybox.tar 192.168.1.22:/root/
docker load -i busybox.tar
自定义镜像原理 :镜像采用分层设计:1,创建读写层 2,修改配置 3,重新打包
使用镜像启动容器,在该容器基础上修改,另存为一个新镜像
############## 创建一个centos的容器,在kube-node1上操作 ##############
##查看所有的镜像
[root@kube-node1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox test 6858809bf669 5 weeks ago 1.232 MB
docker.io/busybox latest 6858809bf669 5 weeks ago 1.232 MB
docker.io/redis latest 82629e941a38 21 months ago 4.98 MB
docker.io/Nginx latest 42b4762643dc 21 months ago 109.2 MB
docker.io/ubuntu latest 20bb25d32758 21 months ago 87.47 MB
docker.io/centos latest 76d6bc25b8a5 2 years ago 199.7 MB
##-it 以交互式终端的方式,根据centos镜像启动一个容器
##/bin/bash 为容器内的命令,容器内存在,才可以使用
[root@kube-node1 ~]# docker run -it docker.io/centos:latest /bin/bashh
################ 容器内安装yum, 在kube-node1上操作 ##############
#清除网络yum文件,配置本地yum
[root@d76e8f39e026 /]# rm -rf /etc/yum.repos.d/*
[root@d76e8f39e026 /]# vi /etc/yum.repos.d/centos7.repo
[centos]
name=centos7.5
baseurl=http://192.168.1.100/centos-1804
enabled=1
gpgcheck=0
##清空缓存,重新加载配置
[root@d76e8f39e026 /]# yum clean all
[root@d76e8f39e026 /]# yum repolist
........
Determining fastest mirrors
centos | 3.6 kB 00:00
(1/2): centos/group_gz | 166 kB 00:00
(2/2): centos/primary_db | 5.9 MB 00:00
repo id repo name status
centos centos7.5 9911
repolist: 9911
################ 容器内安装基础工具软件包, 在kube-node1上操作 ##############
##安装基础工具软件包
[root@d76e8f39e026 /]# yum -y install net-tools psmisc iproute vim bashcompletion tree
##清除yum缓存,减小容器大小,用于镜像制作
[root@d76e8f39e026 /]# yum clean all
##退出容器,主机名就是容器的ID号
[root@d76e8f39e026 /]# exit
################# commit自定义镜像,在kube-node1上操作 ##############
##commit 提交容器,生成新的镜像;此ID为容器的ID号
[root@kube-node1 ~]# docker commit d76e8f39e026 myos:latest
sha256:10a665c54e587d47756a00058abef86ef6b329b44937aaea34376482c9410878
##myos镜像,就是新生成的镜像
[root@kube-node1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
myos latest 10a665c54e58 About a minute ago 317.8 MB
........
############## 验证新的镜像,在kube-node1上操作 ##############
##查看历史镜像,多出一个镜像层
[root@kube-node1 ~]# docker history myos:latest
IMAGE CREATED CREATED BY SIZE COMMENT
10a665c54e58 3 minutes ago /bin/bash 118.1 MB
.......
##使用新的镜像生成一个容器,容器的yum已经部署,验证成功
[root@kube-node1 ~]# docker run -it myos:latest /bin/bash
[root@5dbc2153d039 /]# yum repolist
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
repo id repo name status
centos centos7.5 9911
repolist: 9911
语法
配置 yum、安装软件
FROM docker.io/centos:latest
RUN rm -f /etc/yum.repos.d/*
COPY local.repo /etc/yum.repos.d/local.repo
RUN yum install -y bash-completion net-tools iproute psmisc
使用 Dockerfile 工作流程,根据Dockerfile生成新的镜像,build创建新的镜像;-t指定新镜像的名字和标签;. 指定Dockerfile文件所在的目录
########### 获取制作镜像的历史命令,在kube-node1上操作 ##############
##利用myos镜像,创建一个容器,可以查看之前制作镜像的历史命令
[root@kube-node1 ~]# docker run -it myos:latest
docker build -t imagename Dockerfile 所在目录
[root@096875f0df8d /]# history
1 rm -rf /etc/yum.repos.d/*
2 vi /etc/yum.repos.d/centos7.repo
3 yum clean all
4 yum repolist
5 yum -y install net-tools psmisc vim iproute vim bash-completiono tree
6 exit
7 history
##exit 退出,并关闭容器
[root@096875f0df8d /]# exit
########## 制作Dockerfile自动创建镜像脚本,在kube-node1上操作 ##############
##创建一个目录,名称任意定义
[root@kube-node1 ~]# mkdir aa
##进入到aa目录下
[root@kube-node1 ~]# cd aa/
##创建Dockerfile文件,文件名不能改变
[root@kube-node1 ~]# touch Dockerfile
##复制repo文件到aa目录下,用户Dockerfile中的文件复制
[root@kube-node1 aa]# cp /etc/yum.repos.d/centos7.repo .
##编写Dockerfile文件,文件名不能改变
##Dockerfile中所有的指令,必须是大写的(例如: FROM, RUN, COPY等)
#FROM 指定基础镜像,Dockerfile会对基础镜像进行编辑,生成新的镜像
#RUN 指定制作命令, 一条RUN,就代表一条要在容器内执行的命令
#COPY 复制,#即把当前目录下的文件,拷贝到容器内
[root@kube-node1 aa]# vim Dockerfile
FROM docker.io/centos:latest
RUN rm -rf /etc/yum.repos.d/*
COPY centos7.repo /etc/yum.repos.d/centos7.repo
RUN yum -y install net-tools psmisc vim iproute vim bash-completiono tree &&
yum clean all
########### 根据Dockerfile生成新的镜像,在kube-node1上操作 ############
##build 创建新的镜像;-t 指定新镜像的名字和标签;. 指定Dockerfile文件所在的目录
[root@kube-node1 aa]# docker build -t newos:latest .
Sending build context to Docker daemon 3.072 kB
Step 1 : FROM docker.io/centos:latest
---> 76d6bc25b8a5
Step 2 : RUN rm -rf /etc/yum.repos.d/*
---> Running in ade538eaf11c
---> a934f7feea65
Removing intermediate container ade538eaf11c
Step 3 : COPY centos7.repo /etc/yum.repos.d/centos7.repo
---> bd5e3914cda6
Removing intermediate container 80ea3d53088e
Step 4 : RUN yum -y install net-tools psmisc vim iproute vim bash-completiono
tree && yum clean all
........
##查看本地仓库镜像,newos创建成功
[root@kube-node1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
newos latest fb3d85796504 33 minutes ago 280.8 MB
myos latest 10a665c54e58 58 minutes ago 317.8 MB
.......
Dockfile中,不指定CMD时,则使用默认的启动命令;如果没有使用CMD指定启动命令,则会继承上一个镜像的默认启动命令;CMD 容器的默认启动命令,有且只能有一条;
FROM myos:latest
MAINTAINER Jacob redhat@163.com
RUN yum -y install httpd
ENV LANG=C
WORKDIR /var/www/html/
EXPOSE 80 443
CMD ["httpd", "-DFOREGROUND"]
######## WORKDIR 在Dockerfile中用于定义容器默认工作目录 ###########
#使用ssh远程执行以下三条命令,f1和f2文件,最终都是创建在/root目录下
#因为每次ssh连接都是代表不同的连接,无法保持上次连接时,命令的执行状态
[root@localhost ~]# ssh host1 touch f1
[root@localhost ~]# ssh host1 cd /tmp
[root@localhost ~]# ssh host1 touch f2
##### Dockerfile和ssh类似,所以要使用 WORKDIR容器默认工作目录的指定 #####
###### 使用myos镜像创建一个容器,在kube-node1上操作 ############
##查看本地仓库镜像,myos镜像已经部署好了yum和基本软件包
[root@kube-node1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
myos latest 10a665c54e58 58 minutes ago 317.8 MB
.......
####-it 以交互式终端的方式,根据centos镜像启动一个容器
##/bin/bash 为容器内的命令,容器内存在,才可以使用,不指定则会选择默认容器命令
[root@kube-node1 ~]# docker run -it myos:latest /bin/bash
[root@a670096c60ad /]#
############ 部署并启动apache服务,在kube-node1上操作 ############
####安装apache的服务软件httpd
[root@a670096c60ad /]# yum -y install httpd
#因为容器内并没有systemd的服务,无法使用systemctl来启动httpd的服务
#查看httpd的服务文件,获取环境变量文件和服务启动命令
[root@a670096c60ad /]# cat /lib/systemd/system/httpd.service
........
[Service]
........
#环境变量文件
EnvironmentFile=/etc/sysconfig/httpd
#启动命令,$OPTIONS 此环境变量为空,可以不用写
ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND
........
####从环境变量文件中,获取环境变量
[root@a670096c60ad /]# vim /etc/sysconfig/httpd
......
LANG=C
####设置环境变量
[root@a670096c60ad /]# LANG=C
#启动httpd服务,$OPTIONS 此环境变量为空,可以不用写
#Ctrl + C 退出
[root@54cb8bfa063d /]# /usr/sbin/httpd -DFOREGROUND
AH00558: httpd: Could not reliably determine the server's fully qualified domain
name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this
message
########## 制作Dockerfile自动创建镜像脚本,在kube-node1上操作 ###########
##创建一个目录,名称任意定义
[root@kube-node1 ~]# mkdir bb
##进入到aa目录下
[root@kube-node1 ~]# cd bb/
##创建Dockerfile文件,文件名不能改变
[root@kube-node1 ~]# touch Dockerfile
##Dockerfile中所有的指令,必须是大写的(例如: FROM, RUN, COPY等)
#FROM 指定基础镜像,Dockerfile会对基础镜像进行编辑,生成新的镜像
#MAINTAINER 指定创建镜像者的信息
#RUN 指定制作命令, 一条RUN,就代表一条要在容器内执行的命令
#ENV 指定环境变量
#EXPOSE 开启httpd服务要使用的端口,80和443
#WORKDIR 指定启动容器后的,默认工作目录
#ADD 指拷贝,Dockerfile目录下的文件,拷贝到容器内(tar.gz,tar.bz2格式会自动解压)
#CMD 指定默认启动命令,格式示例:#ls -la 则: CMD ["ls", "-l", "-a"]
[root@kube-node1 bb]# vim Dockerfile
FROM myos:latest
MAINTAINER tarena
RUN yum -y install httpd
ENV LANG=C
EXPOSE 80 443
WORKDIR /var/www/html
ADD index.html /var/www/html/index.html
CMD ["/usr/sbin/httpd","-DFOREGROUND"]
############ 创建apache的默认访问页面,在kube-node1上操作 ##############
[root@kube-node1 bb]# echo "hello world" > index.html
创建服务镜像:docker build -t myos:httpd
########## 使用Dockerfile文件,创建新的镜像,在kube-node1上操作 ##########
##build 创建新的镜像;-t 指定新镜像的名字和标签;. 指定Dockerfile文件所在的目录
[root@kube-node1 bb]# docker build -t myos:httpd .
Sending build context to Docker daemon 3.072 kB
Step 1 : FROM myos:latest
---> 10a665c54e58
Step 2 : RUN yum -y install httpd
---> Running in b3226773e826
.......
运行容器验证服务
############# 验证查看镜像,在kube-node1上操作 #############
##查看镜像,myos:httpd 镜像创建成功
[root@kube-node1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
myos httpd 019f5b48a5a0 About a minute ago 372.4 MB
......
##使用myos:httpd 镜像,创建一个容器
[root@kube-node1 ~]# docker run -itd myos:httpd
800b21aa9736bd68a521e7d5667835710b24829a136c5a0baa3e24cc319d3b70
##查看正在使用的容器
[root@kube-node1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED
STATUS PORTS NAMES
800b21aa9736 myos:httpd "/usr/sbin/httpd -DFO" About a minute
ago Up About a minute 80/tcp, 443/tcp reverent_thompson
##查看容器的详细信息
[root@kube-node1 ~]# docker inspect 800b21aa9736
........
........
########## ENV中, PATH 指定可执行文件的搜索路径,为命令的默认查找路径 ###########
############# 如果没有指定PATH,则执行所有命令,都需要指定绝对路径 ###########
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"LANG=C"
],
############# Cmd 默认的启动命令,即:启动容器时,默认的启动命令 #############
"Cmd": [
"/bin/sh",
"-c",
"#(nop) ",
"CMD ["/usr/sbin/httpd" "-DFOREGROUND"]"
],
........
........
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID":
"b0cf7b16b65e272fa685ac975bce1f13647379beb8e22191d6623e30817829bc",
"EndpointID":
"f010d043874446d28892fa52903165f7370cccbc7cf449d325ad07c1c58fe6c4",
################## 容器的网关和IP地址 #########################
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"macAddress": "02:42:ac:11:00:02"
........
........
####### 根据容器的IP地址,访问容器内的httpd服务,在kube-node1上操作 ########
##访问容器内的apache服务
[root@kube-node1 ~]# curl http://172.17.0.2
hello world
docker主机修改配置文件 /etc/sysconfig/docker
Docker容器不保持任何数据,重要数据请使用外部卷存储(数据持久化),容器可以挂在真实机目录或共享存储为卷
将真实机目录挂载到容器中提供持久化存储,目录不存在就自动创建,目录存在就直接覆盖掉,多个容器可以映射同一个目录,来达到数据共享的目的
启动容器时,使用 -v 参数映射卷 docker run -it -v 真实目录: 容器内目录 docker.io/centos: latest
有多台 docker 主机的情况下,我们也可以使用共享存储,来作为docker的卷服务,可以实现多主机之间多容器的共享卷服务
默认容器可以访问宿主机,但外部网络的主机不可以访问容器内的资源,解决这个问题的最佳方法是端口绑定,容器可以与宿主机的端口进行绑定,从而把宿主机变成对应的服务。宿主机和容器内部的服务端口绑定以后,用户在访问宿主机的服务端口时,就是在访问容器内部的服务
我们使用 -p参数把容器端口和宿主机端口绑定 -p 宿主机端口: 容器端口
例如:把宿主机变成 httpd
docker run -itd -p 80:80 docker.io/myos:httpd
例如:把宿主机变成nginx
docker run -itd -p 80:80 docker.io/nginx:latest
是一个功能齐全的容器引擎,它是一个简单的无需守护的用来管理镜像、容器的工具。Podman提供了一个与Docker CLI兼容的操作方式,简单地说:alias docker=podman。大多数Podman命令都可以普通用户运行,而无需其他额外的权限。
图片
指的是针对应用所需的运行环境资源(依赖库/目录/网络/用户……等)进行整体封装的技术。封装好的镜像相比虚拟机的粒度要更细,可移植性强。每个容器采用沙箱机制,相互隔离。
传统虚拟化与容器技术对比:
图片
仓库=》镜像=》容器 的关系:
# yum module install -y container-tools //安装容器工具及其模块配置
# yum install -y podman-docker //安装docker兼容包(可选)
1)设置默认的仓库地址(全局配置)
可以使用官方仓库(比如
registry.access.redhat.com)、第三方仓库(比如docker.io),或者私有仓库(比如registry.lab.example.com)。
# vim /etc/containers/registries.conf
[registries.search]
registries = ['registry.lab.example.com'] //设置搜索镜像的默认仓库地址
.. ..
[registries.insecure]
registries = ['registry.lab.example.com'] //允许访问不安全的仓库(比如HTTPS证书无效或过期等情况)
.. ..
2)登录仓库(如果需要的话,比如push上传镜像时)
# podman login registry.lab.example.com
Username: admin
Password: ***********
Login Succeeded!
3)搜索仓库中的镜像(比如nginx)
# podman search nginx
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
example.com registry.lab.example.com/library/nginx
1)下载镜像到本地
# podman pull registry.lab.example.com/library/nginx
.. ..
//容器存储默认工作目录 /var/lib/containers/
2)查看镜像
# podman images //列出本地镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
registry.lab.example.com/nginx latest 4bb46517cac3 3 months ago 137 MB
# podman image inspect 4bb4 //查看xxxx镜像的详细配置信息
.. ..
3)导出/备份镜像
# podman save nginx > /root/nginx.tar
4)导入镜像
# podman load -i /root/nginx.tar nginx-new:latest
5)删除镜像
# podman rmi xxxx //删除ID为xxxx的镜像
# podman rmi -a //删除所有镜像
# podman run -d registry.lab.example.com/library/nginx
80b22e7bd4d789773223f5afc85808ea472e82ec72f162903cd658ed6d98091c
# podman ps //列出启用中的容器(结合-a选项可以列出所有)
.. ..
# podman container inspect 4bb4 //查看xxxx容器的详细信息
.. ..
# podman run --rm registry.lab.example.com/library/nginx cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 10 (buster)"
NAME="Debian GNU/Linux"
.. ..
# podman run -it registry.lab.example.com/library/nginx /bin/bash
root@840b592a6d3f:/# nginx -v //检查nginx版本
nginx version: nginx/1.19.2
root@840b592a6d3f:/# ls /usr/share/nginx/html/ //检查网页目录
50x.html index.html
root@840b592a6d3f:/# exit //退出容器
exit
#
[root@red ~]# podman run -d -p 8000:80 nginx
2b9ef8c0864149e2cf7860e903e36ba9deaa1717863f172b2bf2e5c5f3f6600c
[root@red ~]# podman ps //列出活动中的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2b9ef8c08641 registry.lab.example.com/library/nginx:latest nginx -g daemon o... 2 minutes ago Up 2 minutes ago 0.0.0.0:8000->80/tcp ecstatic_maxwell
.. ..
[root@red ~]# curl http://127.0.0.1:8000 //通过主机端口访问容器中的web站点
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
.. ..
# mkdir /opt/webroot //准备网页目录
# echo "Podman Test" > /opt/webroot/index.html //准备默认测试网页
# podman run -d -p 8001:80 -v /opt/webroot:/usr/share/nginx/html nginx
ba64a15abdce1dbd4ed834ad061efde2f7ea421a862076468cbbd694c587f8ca
# curl http://127.0.0.1:8001 //测试结果
Podman Test
[root@red ~]# podman exec -it ba64 bash
root@ba64a15abdce:/# service nginx status
[ ok ] nginx is running.
root@ba64a15abdce:/# exit
exit
[root@red ~]#
[root@red ~]# podman inspect ba64 | grep IPAddress
.. ..
"SecondaryIPAddresses": null,
"IPAddress": "10.88.0.6",
.. ..
[root@red ~]# echo AAAA > /root/a.html //建立测试网页
[root@red ~]# podman cp /root/a.html ba64:/usr/share/nginx/html/a.html //复制文件到容器
[root@red ~]# curl http://127.0.0.1:8001/a.html //确认结果
AAAA
[root@red ~]# curl http://localhost:8001/ //浏览8001端口访问目标容器首页
Podman Test
[root@red ~]# curl http://localhost:8001/a.html //浏览指定页面
AAAA
[root@red ~]# podman stop ba64 //若要杀容器改用kill
ba64a15abdce1dbd4ed834ad061efde2f7ea421a862076468cbbd694c587f8ca
[root@red ~]# podman ps -a | grep ba64 //检查容器状态
ba64a15abdce registry.lab.example.com/library/nginx:latest nginx -g daemon o... 47 minutes ago Exited (0) 25 seconds ago 0.0.0.0:8001->80/tcp dreamy_swirles
[root@red ~]# podman start ba64 //启用已关闭的xx容器
ba64a15abdce1dbd4ed834ad061efde2f7ea421a862076468cbbd694c587f8ca
[root@red ~]# podman ps -a | grep ba64 //检查容器状态
ba64a15abdce registry.lab.example.com/library/nginx:latest nginx -g daemon o... 48 minutes ago Up 2 seconds ago 0.0.0.0:8001->80/tcp dreamy_swirles
[root@red ~]# podman rm -f ba64 //删除已关闭的xx容器(如果不加-f,则需要先stop此容器)
ba64a15abdce1dbd4ed834ad061efde2f7ea421a862076468cbbd694c587f8ca
[root@red ~]# podman ps -a | grep ba64 //检查删除结果(无输出)
[root@red ~]#
[root@red ~]# podman run --name myweb -d -p 80:80 -v /opt/webroot:/usr/share/nginx/html nginx
52e6996bef86c501731115216c84a2f48d1a03f8c1a2cad70d27e281bd642b18
[root@red ~]# cd /etc/systemd/system/ //进入服务配置目录
[root@red system]# podman generate systemd -n myweb --files
/etc/systemd/system/container-myweb.service
[root@red system]# systemctl daemon-reload
4)配置congtainer-myweb服务开机自启
[root@red system]# systemctl enable container-myweb
Created symlink /etc/systemd/system/multi-user.target.wants/container-myweb.service → /etc/systemd/system/container-myweb.service.
5)关闭当前运行的容器
[root@red system]# podman stop 52e6
52e6996bef86c501731115216c84a2f48d1a03f8c1a2cad70d27e281bd642b18
6)重启主机后,检查是否可以访问此web
[root@red system]# reboot
.. ..
[root@server1 ~]# curl http://172.25.0.26/
Podman Test
通过rootless无根模式,非特权用户也可以很方便的运行容器(允许开启1024以上端口),以提高服务管理的安全性。
!!! 确认非特权用户的起始可用端口(需要时可更改)
# cat /proc/sys/net/ipv4/ip_unprivileged_port_start
1024
使用systemctl --user会话时,注意要直接以普通用户SSH或console控制台登录,不要使用su或sudo的方式执行。
[zaniu@red ~]$ mkdir -p ~/.config/containers
[zaniu@red ~]$ vim ~/.config/containers/registries.conf
unqualified-search-registries = ['registry.lab.example.com']
[[registry]]
location = "registry.lab.example.com"
insecure = true //允许访问不安全的仓库(全局配置中也需要添加仓库地址)
blocked = false
[zaniu@red ~]$ podman login registry.lab.example.com //登录仓库(如果仓库要求的话)
Username: admin
Password:
Login Succeeded!
[zaniu@red ~]$ podman pull registry.lab.example.com/library/nginx //下载镜像到本地
.. ..
//用户容器存储默认工作目录 ~/.local/share/containers/
[zaniu@red ~]$ podman images //检查本地镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
registry.lab.example.com/library/nginx latest 4bb46517cac3 3 months ago 137 MB
2)启动一个名为xxnginx的容器(如果SELinux要求启用的话,可以通过:Z传递安全标签)
[zaniu@red ~]$ mkdir /home/zaniu/html
[zaniu@red ~]$ echo zaniu > /home/zaniu//html/index.html
[zaniu@red ~]$ podman run --name xxnginx -d -p 8080:80 -v /home/zaniu/html:/usr/share/nginx/html:Z nginx
8fa1bc2ccd14ddc57e187ffe8e0035b6bfb1c3189460b3470b3935365f5d9a85
[zaniu@red ~]$ curl http://127.0.0.1:8080
zaniu
[zaniu@red ~]$ mkdir -p ~/.config/systemd/user //创建用户服务配置目录
[zaniu@red ~]$ cd ~/.config/systemd/user //进入用户服务配置目录
[zaniu@red user]$ podman generate systemd --name xxnginx --files //生成container-xxnginx服务配置
/home/zaniu/.config/systemd/user/container-xxnginx.service
[zaniu@red user]$ systemctl --user daemon-reload //更新用户服务配置
[zaniu@red user]$ systemctl --user enable container-xxnginx.service //配置自启动
Created symlink /home/zaniu/.config/systemd/user/multi-user.target.wants/container-xxnginx.service → /home/zaniu/.config/systemd/user/container-xxnginx.service.
[zaniu@red user]$ loginctl enable-linger //允许为未登录的用户启动/保持后台服务
//如果linger方式无效,也可以通过用户计划任务实现开机自启动
[zhsan@red user]$ crontab -e
@reboot systemctl --user start container-xxnginx.service
[zaniu@red user]$ podman stop xxnginx //停止原来手动运行的容器
[zaniu@red user]$ systemctl --user start container-xxnginx.service //启动容器服务
[zaniu@red user]$ systemctl --user status container-xxnginx.service //检查容器状态
[zaniu@red user]$ systemctl --user stop container-xxnginx.service //停止容器服务
6)重启主机后,确认仍然可以访问web
[root@red system]# reboot
.. ..
[root@server1 ~]# curl http://172.25.0.26:8080/