Linux | 红帽认证 | IT技术 | 运维工程师
👇1000人技术交流 备注【公众号】更快通过

命令格式:
docker commit [选项] 容器ID/名称 仓库名称:[标签]
常用选项:
-m说明信息;
-a作者信息;
-p生成过程中停止容器的运行。
[root@bogon ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c4f11e1e291c nginx:latest "/docker-entrypoint.…" 4 seconds ago Up 2 seconds 80/tcp mynginx
[root@bogon ~]# docker commit -m "new nginx" -a "LiChuang" mynginx mynginx:1.0
sha256:0a817de5a6dbc2fa1775e78110f25ffb9d51e76151afffed868c73aee
[root@bogon ~]# docker images mynginx
REPOSITORY TAG IMAGE ID CREATED SIZE
mynginx 1.0 0a817de5a6db 7 seconds ago 187MB
[ ]
[ ]
sha256:234ce98feb5e54fbab7dca81bfc39b85de49a246c54d86438e
[ ]
REPOSITORY TAG IMAGE ID CREATED SIZE
debian new 234c 2 minutes ago 215MB
指令
含义
FROM 镜像
指定新镜像所基于的镜像,第一条指令必须为FROM指令,每创建一个镜像就需要一条FROM指令。
MAINTAINER 名字
说明新镜像的维护人信息
RUN命令
在所基于的镜像上执行命令,并提交到新的镜像中
CMD[“要运行的程序“,”参数1,“参数2“]
指令启动容器时要运行的命令或者脚本,Dockerfile只能有一条CMD命令,如果指定多条则只能最后一条被执行
EXPOSE 端口号
指定新镜像加载到Docker时要开启的端口
ENV 环境变量 变量值
设置一个环境变量的值,会被后面的RUN使用
ADD 源文件/目录 目标文件/目录
将源文件复制到目标文件,源文件要与Dockerfile位于相同目录中,或者是一个URL
COPY 源文件/目录 目标文件/目录
将本地主机上的文件/目录复制到目标地点,源文件/目录要与Dockerfile在相同的目录中
VOLUME [“目录“]
在容器中创建一个挂载点
USER 用户名/UID
指定运行容器时的用户
WORKDIR 路径
为后续的RUN、CMD、ENTRYPOINT指定工作目录
ONBUILD 命令
指定所生成的镜像作为一个基础镜像时所要运行的命令
HEALTHCHECK
健康检查
[root@bogon ~]# mkdir sshd
[root@bogon ~]# cat sshd/Dockerfile
# 第一行必须指明基于的基础镜像
FROM centos:7.6.1810
# 作者信息(可选)
MAINTAINER name
# 镜像的操作指令
RUN yum -y install initscripts openssh-server && \
mkdir -p /sshd && \
echo "root:" | chpasswd && \
echo '#!/bin/bash' > /sshd/run.sh && \
# 生成主机密钥
echo '/usr/sbin/sshd-keygen -A' >> /sshd/run.sh && \
echo '/usr/sbin/sshd -D ' >> /sshd/run.sh && \
chmod -R 755 /sshd/run.sh
# 取消pam限制
RUN sed -ri 's/session required pam_loginuid.so/#session required pam_loginuid.so/g' /etc/pam.d/sshd
# 开放端口
EXPOSE 22
# 设置自启动命令
CMD ["/sshd/run.sh"]
[root@bogon ~]# cd sshd/
# 构建镜像,要注意要在有Dockerfile文件的目录执行
[root@bogon sshd]# docker build -t sshd:v1 .
# 基于刚才制作的镜像启动成容器
[root@bogon sshd]# docker run -id --name sshdkgc -p 10003:22 sshd:v1
4eb1ccf3330c36acfcf64f5fc1cd6aa2cd2f6ca9802b29482de80
[root@bogon ~]# mkdir systemctl
[root@bogon ~]# cat systemctl/Dockerfile
# 指定sshd:v1的镜像
FROM sshd:v1
# 指定容器的环境
ENV container docker
# 命令
RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == \
systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*; \
rm -f /etc/systemd/system/*.wants/*; \
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*; \
rm -f /lib/systemd/system/anaconda.target.wants/*;
# 挂载宿主机的/sys/fs/cgroup
VOLUME [ "/sys/fs/cgroup" ]
# 启动容器的时候执行的命令
CMD ["/usr/sbin/init"]
[root@bogon ~]# cd systemctl/
[root@bogon systemctl]# docker build -t systemctl:v1 .
# --privileged 特权模式运行一般以特权模式运行后面要传递/sbin/init
# -v 磁盘挂载
[root@bogon systemctl]# docker run --privileged -tid -v /sys/fs/cgroup:/sys/fs/cgroup:ro systemctl:v1 /sbin/init
[root@bogon ~]# mkdir nginx
[root@bogon ~]# wget -P nginx/ http://nginx.org/download/nginx-1.15.2.tar.gz
[root@bogon ~]# cat nginx/Dockerfile
FROM centos:7.6.1810
RUN yum -y install gcc make pcre-devel zlib-devel tar zlib
ADD nginx-1.15.2.tar.gz /usr/src/
RUN cd /usr/src/nginx-1.15.2 \
&& mkdir /usr/local/nginx \
&& https://mp.weixin..com/configure --prefix=/usr/local/nginx && make && make install \
&& ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
RUN rm -rf /usr/src/nginx-1.15.2
EXPOSE 80
EXPOSE 443
CMD ["nginx","-g","daemon off;"]
[root@bogon ~]# cd nginx/
[root@bogon nginx]# docker build -t nginx:kgc .
[root@bogon nginx]# docker run -d -p 80:80 --name kgcnginx nginx:kgc
b6b6a8f0023068db896b434acfebaa6ae94a7c3eb34ad9b83c3969da40
[root@bogon ~]# mkdir mysql
[root@bogon ~]# cat mysql/Dockerfile
# 指定基础镜像
FROM hub.c.163.com/library/mysql:5.7
# 修改编码方式
RUN echo "character-set-server=utf8" /etc/mysql/mysql.conf.d/mysqld.cnf
RUN service mysql restart
EXPOSE 3306
[root@bogon ~]# cd mysql/
[root@bogon mysql]# docker build -t mysql:kgc .
# -e 传递环境变量
[root@bogon mysql]# docker run --name mymysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:kgc
4195b0e00b85d73117d665c036945a7e89e5a30eb4d06e71500ef
[root@bogon ~]# mkdir lnmp
[root@bogon ~]# cat lnmp/Dockerfile
# 基础镜像
FROM centos:7.6.1810
# 配置nginx的yum源
RUN rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
# 初始化RPM数据库并安装nginx
RUN rpm --rebuilddb && yum -y install nginx
# 修改 nginx 配置文件,使之支持 php
RUN sed -i '/^user/s/nginx/nginx\ nginx/g' /etc/nginx/nginx.conf
COPY default.conf /etc/nginx/conf.d/default.conf
# 安装 mariadb 和 php
RUN rpm --rebuilddb && yum -y install mariadb-server mariadb-devel mariadb php-mysql php php-fpm
# 修改php-fpm配置文件
RUN sed -i '/^user/s/apache/nginx/g' /etc/php-fpm.d/www.conf
RUN sed -i '/^group/s/apache/nginx/g' /etc/php-fpm.d/www.conf
# 声明Mariadb的用户以及密码
ENV MARIADB_USER root
ENV MARIADB_PASS
# 支持中文
ENV LC_ALL en_US.UTF-8
# 添加并运行脚本
ADD db_init.sh /root/db_init.sh
RUN chmod 775 /root/db_init.sh
RUN /root/db_init.sh
ADD run.sh /root/run.sh
RUN chmod 775 /root/run.sh
ADD index.php /usr/share/nginx/html/index.php
# 开放的端口
EXPOSE 80
EXPOSE 3306
EXPOSE 443
EXPOSE 9000
# 每次创建容器运行此脚本
CMD ["/root/run.sh"]
[root@bogon ~]# cat lnmp/default.conf
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.php index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html$fastcgi_script_name;
include fastcgi_params;
}
}
[root@bogon ~]# cat lnmp/db_init.sh
mysql_install_db --user=mysql
sleep 3
mysqld_safe &
sleep 3
# 涉及到的变量在Dockerfile中都已经声明
mysqladmin -u "$MARIADB_USER" password "$MARIADB_PASS"
# 授权命令
mysql -u"$MARIADB_USER" -p"$MARIADB_PASS" -e "use mysql; grant all privileges on *.* to '$MARIADB_USER'@'%' identified by '$MARIADB_PASS' with grant option;"
mysql -u"$MARIADB_USER" -p"$MARIADB_PASS" -e "grant all privileges on *.* to '$MARIADB_USER'@'localhost' identified by '$MARIADB_PASS';"
h=$(hostname)
mysql -u"$MARIADB_USER" -p"$MARIADB_PASS" -e "use mysql; update user set password=password('$MARIADB_PASS') where user='$MARIADB_USER' and host='$h';"
[root@bogon ~]# cat lnmp/run.sh
mysqld_safe &
/usr/sbin/nginx &
/usr/sbin/php-fpm
[root@bogon ~]# cat lnmp/index.php
<?php
echo date("Y-m-d H:i:s")."<br />\n";
$link=mysql_connect("localhost","root","");
if(!$link) echo "FAILD!";
else echo "MySQL is OK!";
phpinfo();
?>
[root@bogon ~]# cd lnmp/
[root@bogon lnmp]# docker build -t centos:lnmp .
[root@bogon lnmp]# docker run -d --name lnmp -P centos:lnmp /root/run.sh
fd2e0d88c541f1eb3645edd053f2cceb69ba96ff33f3f123
[root@bogon lnmp]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fd2e0d88c541 centos:lnmp "/root/run.sh" 2 seconds ago Up 2 seconds 0.0.0.0:32775->80/tcp, :::32775->80/tcp, 0.0.0.0:32774->443/tcp, :::32774->443/tcp, 0.0.0.0:32773->3306/tcp, :::32773->3306/tcp, 0.0.0.0:32772->9000/tcp, :::32772->9000/tcp lnmp
Dockefile 特别长,可维护性降低。
镜像的层次多,体积大,部署时间长。
源代码存在泄漏的风险。
# 未使用多阶段构建
[root@bogon ~]# mkdir demo
[root@bogon ~]# cd demo/
# 编写C语言测试代码
[root@bogon demo]# cat demo.c
# include<stdio.h>
int main()
{
printf("%s\n","This is a demo!");
return 0;
}
# 编写Dockerfile
[root@bogon demo]# cat Dockerfile
FROM centos:7.6.1810
ENV VERSION 1.0
WORKDIR /demo
COPY demo.c .
RUN yum install -y gcc && \
gcc -v
RUN gcc demo.c -o demo && \
rm -f demo.c && \
yum erase -y gcc && \
cp demo /usr/local/bin/
CMD ["demo"]
[root@bogon demo]# docker build -t demo:v1 .
[root@bogon demo]# docker images demo
REPOSITORY TAG IMAGE ID CREATED SIZE
demo v1 4575ab 21 seconds ago 526MB
# 使用多阶段构建
[root@bogon ~]# mkdir demo
[root@bogon ~]# cd demo/
# 编写C语言测试代码
[root@bogon demo]# cat demo.c
# include<stdio.h>
int main()
{
printf("%s\n","This is a demo!");
return 0;
}
# 编写Dockerfile
[root@bogon demo]# cat Dockerfile
FROM centos:7.6.1810
ENV VERSION 1.0
WORKDIR /demo
COPY demo.c .
RUN yum install -y gcc && \
gcc -v
RUN gcc demo.c -o demo && \
rm -f demo.c && \
yum erase -y gcc && \
cp demo /usr/local/bin/
FROM centos:7.6.1810
# --from表示从第一个FROM的流程里面复制
COPY --from=0 /usr/local/bin/demo /usr/local/bin/demo
CMD ["demo"]
[root@bogon demo]# docker build -t demo:v2 .
# 可以看到使用多阶段构建后镜像大小有明显缩减
[root@bogon demo]# docker images demo
REPOSITORY TAG IMAGE ID CREATED SIZE
demo v2 c05a904e23a7 3 seconds ago 202MB
demo v1 4575ab 2 minutes ago 526MB
FROM centos:7.6.1810 AS build
ENV VERSION 1.0
WORKDIR /demo
COPY demo.c .
RUN yum install -y gcc && \
gcc -v
RUN gcc demo.c -o demo && \
rm -f demo.c && \
yum erase -y gcc && \
cp demo /usr/local/bin/
FROM centos:7.6.1810
# --from表示从build的流程里面复制
COPY --from=build /usr/local/bin/demo /usr/local/bin/demo
CMD ["demo"]
课程咨询添加:HCIE666CCIE
↑或者扫描上方二维码↑
你有什么想看的技术点和内容
可以在下方留言告诉小盟哦!
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/rfx/21931.html