docker系列ddocker入门(一)安装及镜像命令_docker国内源-CSDN博客文章浏览阅读1.5k次,点赞44次,收藏12次。注意:是强依赖Linux环境,即便在windows上部署Docker其本质也都是先安装一个虚拟机,然后在虚拟出来的Linux上再安装并运行Docker。Docker Compose 是一个用于定义和运行多个 Docker 容器的工具,它使用 YAML 文件来定义整个应用程序的服务、网络和卷等,使得可以轻松地部署和扩展多个 Docker 容器。Docker 容器是 Docker 镜像的实例化运行时,它是一个分离的环境,包含了应用程序和其依赖项,能够独立运行于 Docker 主机上。这是由于环境不一致导致的。_docker国内源https://blog.csdn.net/LCL_18/article/details/142632245?spm=1001.2014.3001.5501
docker入门(二)之容器命令及私有仓库的部署(本地和harbor)_桌面docker怎么使用命令保存仓库-CSDN博客文章浏览阅读1.3k次,点赞21次,收藏10次。所以我们大致应该能明白守护进程是给需要在后台默默执行的程序。如redis,如果不添加守护进程,ctrl+c,前台进程结束,容器就停止了,显然不能接受。通过下图可以看到redis开始在正常运行在前台,假如说我要执行其他程序,然后我ctrl+c退出了一下,redis就自动退出了查看容器的状态,发现也是退出了但是添加-d后,它会直接在后台运行,不会在前台占用资源。_桌面docker怎么使用命令保存仓库https://blog.csdn.net/LCL_18/article/details/142869622?spm=1001.2014.3001.5501
基于docker commit 制作镜像
众所周知,centos 7 在2024年6月30日,生命周期结束,官方不再进行支持维护,而很多环境一时之间无法完全更新替换操作系统,因此对于yum源还是需要的。
所以我们docker pull centos:7的镜像也是无法使用yum的。
这里我们就自己制作一个含有yum的镜像。
有两种方式搭建,一种搭建本地yum,一种拉取国内开源镜像站(这里以阿里云举例)
其一:搭建本地yum
大家都知道我们使用虚拟机时必须有相应的映像文件
这里面的镜像文件一般存放在/dev/cdrom
这里我们的先将镜像挂载到一个目录,这里我先选择挂载到/media下
[root@localhost ~]# mount /dev/cdrom /media/
mount: /dev/sr0 写保护,将以只读方式挂载
然后拉取centos:7的镜像
[root@localhost ~]# docker pull centos:7
7: Pulling from library/centos
Digest: sha256:be65f488b7764ad3638f236b7b515b3678369a5124c47b8d32916d6487418ea4
Status: Downloaded newer image for centos:7
docker.io/library/centos:7
这里我拉取的镜像太多了,所以我只显示cnetos:7的这行,方便观察
centos 7 eeb6ee3f44bd 3 years ago 204MB
使用此镜像,创建容器,并添加数据卷映射
宿主机目录必须使用挂载映像文件的目录
[root@localhost ~]# docker run -it --privileged=true -v /media:/media/centos eeb6ee3f44bd /bin/bash
[root@197a502a5c1b /]#
这个时候宿主机media下的文件已经映射到容器/media/centos下
[root@197a502a5c1b /]# ls /media/centos/
CentOS_BuildTag EFI EULA GPL LiveOS Packages RPM-GPG-KEY-CentOS-7 RPM-GPG-KEY-CentOS-Testing-7 TRANS.TBL images isolinux repodata
这个时候进去修改yum本地源的配置文件
[root@197a502a5c1b /]# cat /etc/yum.repos.d/CentOS-Media.repo
[c7-media]
name=CentOS-$releasever - Media
baseurl=file:///media/centos
gpgcheck=0
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
使网络源失效
[
root@197a502a5c1b ~]# mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
清除缓存,重新加载
[root@197a502a5c1b ~]# yum clean all
Loaded plugins: fastestmirror, ovl
Cleaning repos: c7-media
Cleaning up list of fastest mirrors
[root@197a502a5c1b ~]# yum repolist
Loaded plugins: fastestmirror, ovl
Determining fastest mirrors
c7-media | 3.6 kB 00:00:00
(1/2): c7-media/group_gz | 166 kB 00:00:00
(2/2): c7-media/primary_db | 3.1 MB 00:00:00
repo id repo name status
c7-media CentOS-7 - Media 3971
repolist: 3971
其二:配置阿里云源
这里就接着上面继续配置
安装wget
[root@197a502a5c1b ~]# yum install -y wget
把网路源名称改回来
[root@197a502a5c1b ~]# mv /etc/yum.repos.d/CentOS-Base.repo.bak /etc/yum.repos.d/CentOS-Base.repo
取网上找到阿里云开源镜像网站
使用wget把它下载到指定位置
[root@197a502a5c1b ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
清除缓存,重新加载
[root@197a502a5c1b ~]# yum clean all
[root@197a502a5c1b ~]# yum repolist
repo id repo name status
base/7/x86_64 CentOS-7 - Base - mirrors.aliyun.com 10072
c7-media CentOS-7 - Media 3971
extras/7/x86_64 CentOS-7 - Extras - mirrors.aliyun.com 526
updates/7/x86_64 CentOS-7 - Updates - mirrors.aliyun.com 6173
repolist: 20742
退出容器,把容器制成镜像
docker commit 的参数
Options:
-a, --author string Author (e.g., "John Hannibal Smith <[email protected]>")
#表示作者名
-c, --change list Apply Dockerfile instruction to the created image
# 对创建的镜像使用dockerfile命令
-m, --message string Commit message
#描述信息
-p, --pause Pause container during commit (default true)
#暂停容器做镜像
[root@localhost ~]# docker commit -a "xiaoluo" -m "my yum" -p 197a502a5c1b mycentos:1
sha256:9bbe687a6e89fbf654ed06d1c9c18301e370b741474b008c5447d337ff2c3ae6
查看镜像,这个镜像比我们直接拉取的镜像,大很多,为什仫呢,因为它具有配置的源,自然而然会使镜像变大
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mycentos 1 9bbe687a6e89 39 seconds ago 479MB
测试
使用该镜像创建容器
[root@localhost ~]# docker run -it mycentos:1 /bin/bash
[root@7cf0ea61ad7a /]#
查看仓库
[root@7cf0ea61ad7a /]# yum repolist
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
repo id repo name status
!base/7/x86_64 CentOS-7 - Base - mirrors.aliyun.com 10072
!c7-media CentOS-7 - Media 3971
!extras/7/x86_64 CentOS-7 - Extras - mirrors.aliyun.com 526
!updates/7/x86_64 CentOS-7 - Updates - mirrors.aliyun.com 6173
repolist: 20742
基于dockerfile制作镜像
DockerFile是用来构建Docker镜像的文本文件,是一条条构建镜像所需要的指令和参数构成的脚本
构建步骤:
1、编写DockerFile文件
2、docker build 构建镜像
DockerFile内容基础知识
- 每条保留指令都必须为大写字母且后面要跟随至少一个参数
- 指令按照从上向下,顺序执行
- #表示注释
- 每个指令都会创建一个新的镜像层并且对于镜像进行提交
Docker执行DockerFile的大致流程
- Docker从基础镜像运行一个容器
- 每执行一条指令就会对于容器做出修改
- 执行类似docker commit的操作提交一个新的镜像层
- Docker再基于刚提交的镜像运行一个新的容器
- 执行DockeFile 中的下一条指令直到所有指令都执行完成
指令介绍(就相当于命令)
FROM
功能为指定基础镜像,并且必须是第一条指令。
如果不以任何镜像为基础,那么写法为:FROM scratch。
同时意味着接下来所写的指令将作为镜像的第一层开始
这里简单做个废话说明:
所谓基础镜像就是指通过docker pull拉取的或者docker commit创建的镜像。再强调一下由于现在2024年10月22日,centos7从2024年6月30号已经停止维护yum源,所以我们得先去给容器配置yum源再将其打包为镜像。
格式:
FROM 镜像名:版本号
版本号为可选项,没有默认为最新版本号
LABLE
原来是MAINTAINER这个根据英文意思可知,维护者不就是指定作者吗,但新版docker改为使用LABLE指明
但原本的功能为给镜像指定标签
此命令可选择性使用
格式:
LABLE 名字
ADD
一个复制命令,把文件复制到镜像中。如果把虚拟机与容器想象成两台linux服务器的话,那么这个命令就类似于scp,只是scp需要加用户名和密码的权限验证,而ADD不用。可以进行远程连接的命令
格式:
ADD 本地路径/网络路径 容器创建好后存放的位置
COPY
也是一条复制的命令就相当于linux中的cp命令,它与ADD的区别就在于COPY只能复制本地文件
格式:
COPY 本地路径 容器创建好后存放的位置
EXPOSE
功能为暴漏容器运行时的监听端口给外部
EXPOSE并不会使容器访问主机的端口,但是主机可以访问到容器的端口,这是一个单方面的指向
如果想使得容器与主机的端口有映射关系,必须在容器启动(docker run)的时候加上 -p参数
格式:
EXPOSE 端口号 协议类型
不指定协议,默认为tcp协议
ENV
功能为设置环境变量,同docker run -e一样,镜像定义所需的环境变量,并可被ENV指令后面的其它指令所调用。
使用docker run启动容器的时候加上 -e 的参数为定义的变量赋值,可以覆盖Dockerfile中ENV指令指定的变量
格式:
#第一种格式,不建议使用,只能定义一个变量,在定义又得另起一个指令,浪费资源
ENV 变量名 本地路径/值
#第二种格式,可往后定义多个变量
ENV 变量名=本地路径/值 ……
RUN
用于指定docker build过程中运行的程序,可以是任何命令。
RUN指令后所执行的命令必须在FROM指令后的基础镜像中存在才会被执行。
一般是执行shell命令
格式:
RUN shell命令
CMD
指定启动容器的默认要运行的程序,也就是PID为1的进程命令,且其运行结束后,容器也会终止。如果不指定,默认是bash。
CMD指令指定的默认程序会被docker run命令行指定的参数所覆盖。
Dockerfile中可以存在多个CMD指令,但仅最后一个生效。因为一个docker容器只能运行一个PID为1的进程。
类似于RUN指令,也可以运行任意命令或程序,但是两者的运行时间点不同
RUN指令运行在docker build的过程中,而CMD指令运行在基于新镜像启动容器(docker run)时。
格式:
CMD shell命令
ENTRYPOINT
类似CMD指令的功能,用于为容器指定默认运行程序。
Dockerfile中可以存在多个ENTRYPOINT指令,但仅最后一个生效
与CMD区别在于,由ENTRYPOINT启动的程序不会被docker run命令行指定的参数所覆盖,而且这些命令行参数会被当做参数传递给ENTRYPOINT指令指定的程序。
不过,docker run的–entrypoint选项的参数可覆盖ENTRYPOINT指定的默认程序。
格式:
ENTRYPOINT shell命令
USER
用于指定docker build过程中执行任何指令所用的用户
默认情况下为root用户
格式:
USER 用户名/用户id
这里的用户id是指/etc/passwd中用户的有效UID,不能随便指定,不然可能导致docker run 运行时失败
HEALTHCHECK
根据英文意思可知,为健康检查,此指令的就是告诉docker检查容器是否正常工作,因为有的时候就算进程在运行,服务也不一定能够起来
检查肯定不是一次性的,要根据频率,进行指定检查
格式:
HEALTHCHECK --interval=间隔时间 --timeout=超时时间 –retries=重试次数 cmd 健康检测命令
CMD健康检测命令发出时,返回值有三种情况
0:成功
1:不健康
2:保留,无实际意义。
HEALTHCHECK NONE就是不做健康检查
SHELL
用来指定运行程序默认要使用的shell类型,一般来说不用指定
格式:
SHELL shell类型
STOPSLGNAL
指定发送使容器退出的系统调用信号,docker stop之所以能停止容器,就是发送了15的信号给容器内PID为1的进程。但是一般不会使用。
格式:
STOPSLGNAL 指定的信号值
ARG
ARG命令同EVN类似,也是指定一个变量,但不同的是,ENV指令配合-e参数可以在docker run过程中传参,而使用ARG指令配合–build-arg参数可以在docker build过程中传参,这方便了我们为不同场景构建不同镜像。
格式:
ARG 变量名=本地路径/值 ……
ONBULD
用于在Dockerfile中定义一个触发器。
ONBUILD后面指定的指令在docker build时是不会执行,构建完的镜像在被另一个Dockerfile文件中FROM指令所引用的时才会触发执行。
除了FROM指令和MAINTAINER指令不能成为触发器指令,其他均可以,一般多为RUN和ADD
格式:
ONBULD 其他指令
实例构建nginx镜像
创建一个文件夹,用于存放Dockerfile文件
[root@localhost ~]# mkdir /nginx
在该目录下编辑一个安装nginx的脚本
[root@localhost nginx]# vi install.sh
yum install -y wget tar gcc gcc-c++ make pcre pcre-devel zlib zlib-devel
cd /usr/local/src
wget 'http://nginx.org/download/nginx-1.14.2.tar.gz'
tar -zxf nginx-1.14.2.tar.gz
cd nginx-1.14.2
./configure --prefix=/usr/local/nginx && make && make install
rm -rf /usr/local/src/*
在编辑一个启动脚本
[root@localhost nginx]# vi nginx_start.sh
#!/bin/bash
/usr/local/nginx/sbin/nginx -g "daemon off;"
在编辑一个Dockerfile文件
[root@localhost nginx]# vi Dockerfile
# 使用的是前面是前面docker commit 创建的镜像
FROM mycentos:1
COPY install.sh /tmp/install.sh
RUN sh /tmp/install.sh
COPY nginx_start.sh /usr/bin/nginx_start.sh
docker build的参数
-f --file
指定 dockerfile 路径
不指定的话,默认会读取上下文路径( . )下的 dockerfile
-t,--tag
指定构建的镜像名和 tag
--add-host
可以使用一个或多个 --add-host 标志将其他主机添加到容器的 /etc/hosts 文件中
--network
在构建过程中为 RUN 指令设置网络模式
创建mycentos:nginx这个镜像,根据当前所在位置决定写路径,如果Dockerfile文件就在当前目录下,就可以写 ./
[root@localhost nginx]# docker build -t mycentos:nginx ./
查看镜像
[root@localhost nginx]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mycentos nginx 15ef5a937045 19 seconds ago 856MB
使用该镜像启动容器,看看是否启动了nginx服务
[root@localhost nginx]# docker run -itd --name=mynginx mycentos:nginx
c6ed62b2b1fc6e5a018683b678c9026c7ebe85e3c62f44a7227cc0a74e98caeb
查看容器
[root@localhost nginx]# docker run -itd --name mynginx mycentos:nginx
70e6515c92df549ab0398b4d8a981292b7d98723684aefff3775a5a4c3682d88
[root@localhost nginx]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
70e6515c92df mycentos:nginx "/bin/bash" 9 seconds ago Up 8 seconds mynginx
进入该容器
[root@localhost nginx]# docker exec -it mynginx /bin/bash
启动nginx
[root@70e6515c92df /]# cd /usr/local/nginx/
[root@70e6515c92df nginx]# ls
client_body_temp conf fastcgi_temp html logs proxy_temp sbin scgi_temp uwsgi_temp
[root@70e6515c92df nginx]# cd sbin
[root@70e6515c92df sbin]# ls
nginx
[root@70e6515c92df sbin]# ./nginx
查看是否开启80端口
[root@70e6515c92df ~]# netstat -ntlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 37/nginx: master pr
最后希望大家都能变得越来越好!!!
标签:容器,自定义,nginx,指令,镜像,docker,root From: https://blog.csdn.net/LCL_18/article/details/143159907