【docker】docker入门笔记|通过Dockerfile文件构建镜像

目录

什么是docker

Docker的安装和使用

通过Dockerfile文件构建镜像

实例1

实例2

 从镜像库获取Docker镜像,并创建容器

Dockerfile命令

CentOS环境下Docker私有仓库搭建

实例


什么是docker

Docker的比喻:
Docker:工厂和引擎
Dockerfile:房车构造图
Docker image(镜像):房车(未开封使用的)
Docker container(容器):运行使用中的房车
Docker Registry/DockerHub:工厂车库
Docker Compose:老司机
Docker Volume:油箱;如果把容器间内的io数据流比喻成汽油
Docker Swarm(或者K8s):某项活动的房车调度管理中心

Docker的安装和使用

安装docker:(建立工厂)

yum install docker
开启docker:(运行厂子)

systemctl start docker
 

编写Dockerfile文件:(写汽车构造图)

(见后面章节)

构建镜像:(生成房车)

docker build -t   mycart. ##生成镜像

运行镜像成一个容器:(房车用起来)

docker run -d -P  mycart ##运行容器

通过Dockerfile文件构建镜像

实例1

(转自:Dockerfile构建镜像实例_https://blog.csdn.net/klvjb/article/details/110334248)

一、创建工作目录

[root@localhost ~]# mkdir sshd
[root@localhost ~]# cd sshd/

二、编写Dockerfile文件

[root@localhost sshd]# vi Dockerfile
 
FROM centos:7
MAINTAINER This is my sshd service
RUN yum -y update
RUN yum -y install openssh* net-tools lsof telnet passwd ##安装所需工具
RUN echo '123456' | passwd --stdin root   ##设置root密码
RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config  ##修改sshd配置文件,禁用PAM认证
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key   ##生成密钥
RUN sed -i '/^session\s\+required\s\+pam_loginuid_so/s/^/#/' /etc/pam.d/sshd
RUN mkdir -p /root/.ssh && chown root.root /root && chmod 700 /root/.ssh
EXPOSE 22
CMD ["/usr/sbin/sshd","-D"]  ##启动服务

三、构建镜像

[root@localhost sshd]# docker build -t sshd:new . ##生成镜像

-t 指定镜像的名称,如果要指定版本,采用 image:tag 的写法。

四、运行创建的sshd:new镜像成容器实例

[root@localhost sshd]# docker run -d -P sshd:new ##运行容器

五、测试验证sshd服务

[root@localhost sshd]# ssh localhost -p 32768
The authenticity of host '[localhost]:32768 ([::1]:32768)' can't be established.
RSA key fingerprint is SHA256:zDkm6zX8sIs9RbJizWmdpuvigAa4SLJ6e2xcA2iD6ws.
RSA key fingerprint is MD5:4b:2d:d1:77:a2:ed:3b:31:13:de:cb:6a:68:aa:24:e4.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[localhost]:32768' (RSA) to the list of known hosts.
root@localhost's password: 
[root@7a043a1ef891 ~]# 

实例2

(转自:http://t.csdn.cn/Wz7O3

一、创建工作目录

创建目录的目的,用于区分不同镜像的构建。相当于工作空间。

[root@localhost ~]# mkdir nginx
[root@localhost ~]# cd nginx/

二、编写Dockerfile文件

在/install/nginx_build目录下创建Dockerfile文件,内容如下:

[root@localhost nginx]# vi Dockerfile
 
FROM centos:7 ##基于centos7镜像创建
RUN yum -y update
RUN yum -y install gcc gcc-c++ make pcre-devel zlib-devel
ADD nginx-1.12.2.tar.gz /opt  ##解压nginx包到opt目录
WORKDIR /opt/nginx-1.12.2
RUN ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module && make && make install
RUN useradd -M -s /sbin/nologin nginx
ENV PATN /usr/local/nginx/sbin:$PATH   ##导入环境变量
EXPOSE 80  暴露服务端口
EXPOSE 443
RUN echo 'daemon off;' >> /usr/local/nginx/conf/nginx.conf  关闭服务守护进程 ,防止容器启动时进程冲突
ADD run.sh /run.sh
RUN chmod 755 /run.sh
CMD ["/run.sh"]

编辑run脚本

[root@localhost nginx]# vi run.sh
#!/bin/bash
 /usr/local/nginx/sbin/nginx

三、构建镜像

[root@localhost nginx_build]# docker build  -t  nginx:new   -f  ./Dockerfile  ./

-t 指定镜像的名称,如果要指定版本,采用 image:tag 的写法。

-f 指定Dockerfile文件,默认当前文件夹下的Dockerfile。

最后的./指在当前文件夹下编译。

四、使用构建成功的镜像创建容器

 docker run -d -P nginx:new

五、测试

更多实例见:http://t.csdn.cn/Wz7O3

也就可以拉取别人做好的镜像,加以修改使用:

 从镜像库获取Docker镜像,并创建容器


1、 docker search tomcat             #搜索tomcat相关镜像  搜索名叫tomcat的房车
2、 docker pull  cheewai/tomcat      #下载合适的tomcat镜像 从叫cheewai车库获取tomcat房车
3、 docker images                    #查看下载的镜像  查看房车有没有在家

#创建并运行容器,同时把本地/home/chen/目录挂载到容器的/mnt/目录下  #启动房车运行,房车的数据接口/mnt/ 链接家里的/home/chen/
4、docker run -i -t -d -v /home/chen/:/mnt/ cheewai/tomcat     
5、通过 docker attach ${容器id} 或者docker exec -it ${容器id}    /bin/bash  #命令进入容器里 面,进入房车里

6、通过 find ./ -name tomcat  查找tomcat安装路径    #查看tomcat房车的tomcat核心放在哪里

7、进入/mnt/目录查看和本地/home/chen/目录进行对比内容一致

8、cp  /mnt/myweb.war /user/tomcat/webapps/  #把war包移动到tomcat的webapps目录 下 #在房车的/user/tomcat/webapps/下安装myweb.war

9、按Ctrl+p 和Ctrl+q退出容器  #下车

 并执行 docker commit ${容器id}  chen/myweb2 命令提交 容器生成一个的镜像  #安装后,执行命令 让docker工厂按我们改装后的房车 再造一个新房车。

10、docker images  #查看新生成的镜像 #查看新造的房车

11、docker run -i -t -d -v /home/chen/:/mnt/ -p 8090:8080 --name web-server chen/myweb2

#通过chen/myweb2镜像创建并一直运行容器,同时把容器的8080端口映射到宿主机的8090端口,通过宿主机的ip:8090就可以访问容器的8080端口。

12 、docker ps #查看新创建的容器

13、进入容器并启动tomcat,然后通过宿主机ip:8090访问tomcat,同时访问myweb项目,如下图:

注:把项目包放到tomcat下不仅可以通过上面的方式,同时还可以通过 docker cp 命令或者通过Dockerfile指令(正式使用的时候建议通过Dockerfile指令)

原文:https://blog.csdn.net/chen_25_15/article/details/79720037

 1. 什么是Docker镜像


安装过操作系统的同学,应该对这个概念比较熟悉。我们安装操作系统,通常是把镜像文件刻录到U盘,然后可以在多个机器上安装操作系统。有了Docker镜像,我们也可以在不同机器上启动容器,这是两者的相似之处。

 Docker与虚拟机也非常相似,它们最重要的区别就是虚拟机是基于硬件的,而Docker容器是基于内核的

1.1. Docker的文件系统层


Docker镜像结构类似于Linux的虚拟化栈,可以看到第一层(栈底)为Linux内核,接着是引导文件系统。第二层是基础镜像,它可以是某种系统(Centos,Ubuntu等)。基于基础镜像,进而可以构建出更多的镜像,第三层,第四层等。但是对外只暴露栈顶的文件系统

1.2. 写时复制


镜像层的文件系统都是只读的,启动容器时,会把最外层镜像复制到读写层(writeable container),容器便在这个栈区域运行,提交新的镜像也相当于压栈的过程


Dockerfile命令

Dockfile是一种被Docker程序解释的脚本,Dockerfile由一条一条的指令组成,每条指令对应Linux下面的一条命令。Docker程序将这些Dockerfile指令翻译真正的Linux命令。Dockerfile有自己书写格式和支持的命令,Docker程序解决这些命令间的依赖关系,类似于Makefile。

链接:https://www.jianshu.com/p/cbce69c7a52f

Dockerfile的指令是忽略大小写的,建议使用大写,使用#作为注释,

Dockerfile的指令根据作用可以分为两种,构建指令和设置指令

(1). FROM(指定基础image)

(2). MAINTAINER(用来指定镜像创建者信息)

docker inspect命令时,输出中有相应的字段记录该信息。

(3). RUN(安装软件用)

构建指令,如基础image选择了ubuntu,那么只能使用ubuntu的命令。

4). CMD(设置container启动时执行的操作)

设置指令,用于container启动时指定的操作。该操作可以是执行自定义脚本,也可以是执行系统命令。该指令只能在文件中存在一次,如果有多个,则只执行最后一条。

(5). ENTRYPOINT(设置container启动时执行的操作)

可以多次设置,但是只有最后一个有效。如果你还使用了CMD命令且CMD是一个完整的可执行的命令,那么CMD指令和ENTRYPOINT会互相覆盖只有最后一个CMD或者ENTRYPOINT有效。

# CMD指令将不会被执行,只有ENTRYPOINT指令被执行  
CMD echo “Hello, World!”  
ENTRYPOINT ls -l  

(6). USER(设置container容器的用户)

设置指令,设置启动容器的用户,默认是root用户。

# 指定memcached的运行用户  
ENTRYPOINT ["memcached"]  
USER daemon  
或  
ENTRYPOINT ["memcached", "-u", "daemon"]  

(7). EXPOSE(指定容器需要映射到宿主机器的端口)

将容器中的端口映射成宿主机器中的某个端口。当你需要访问容器的时候,可以不是用容器的IP地址而是使用宿主机器的IP地址和映射后的端口。

要完成整个操作需要两个步骤,首先在Dockerfile使用EXPOSE设置需要映射的容器端口,然后在运行容器的时候指定-p选项加上EXPOSE设置的端口,这样EXPOSE设置的端口号会被随机映射成宿主机器中的一个端口号。也可以指定需要映射到宿主机器的那个端口,这时要确保宿主机器上的端口号没有被使用。EXPOSE指令可以一次设置多个端口号,相应的运行容器的时候,可以配套的多次使用-p选项。

# 映射一个端口  
EXPOSE port1  
# 相应的运行容器使用的命令  
docker run -p port1 image  
  
# 映射多个端口  
EXPOSE port1 port2 port3  
# 相应的运行容器使用的命令  
docker run -p port1 -p port2 -p port3 image  
# 还可以指定需要映射到宿主机器上的某个端口号  
docker run -p host_port1:port1 -p host_port2:port2 -p host_port3:port3 image  

端口映射是docker比较重要的一个功能,原因在于我们每次运行容器的时候容器的IP地址不能指定而是在桥接网卡的地址范围内随机生成的。宿主机器的IP地址是固定的,我们可以将容器的端口的映射到宿主机器上的一个端口,免去每次访问容器中的某个服务时都要查看容器的IP的地址。对于一个运行的容器,可以使用docker port加上容器中需要映射的端口和容器的ID来查看该端口号在宿主机器上的映射端口。
链接:https://www.jianshu.com/p/cbce69c7a52f
 

(8). ENV(用于设置环境变量)

  • ENV设置的环境变量,可以使用docker inspect命令来查看。同时还可以使用docker run --env <key>=<value>来修改环境变量。

9). ADD(从src复制文件到container的dest路径)

构建指令,所有拷贝到container中的文件和文件夹权限为0755,uid和gid为0;如果是一个目录,那么会将该目录下的所有文件添加到container中,不包括目录;如果文件是可识别的压缩格式,则docker会帮忙解压缩(注意压缩格式);如果<src>是文件且<dest>中不使用斜杠结束,则会将<dest>视为文件,<src>的内容会写入<dest>;如果<src>是文件且<dest>中使用斜杠结束,则会<src>文件拷贝到<dest>目录下。

格式:

ADD <src> <dest>

  • <src> 是相对被构建的源目录的相对路径,可以是文件或目录的路径,也可以是一个远程的文件url;
  • <dest> 是container中的绝对路径

(10). VOLUME (指定挂载点)

创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等

Volume设置指令,使容器中的一个目录具有持久化存储数据的功能,该目录可以被容器本身使用,也可以共享给其他容器使用

FROM base  
VOLUME ["/tmp/data"] 

11). WORKDIR(切换目录)

设置指令,可以多次切换(相当于cd命令),对RUN,CMD,ENTRYPOINT生效。

格式:

WORKDIR /path/to/workdir

(13). COPY(复制本地主机的src文件为container的dest)

复制本地主机的src文件(为Dockerfile所在目录的相对路径、文件或目录 )到container的dest。目标路径不存在时,会自动创建。

格式:

COPY <src> <dest>

CentOS环境下Docker私有仓库搭建

https://www.cnblogs.com/kangoroo/p/7994801.html

docker run 和 docker exec 的差异

docker run :根据镜像创建一个容器并运行一个命令,操作的对象是 镜像;

docker exec :在运行的容器中执行命令,操作的对象是 容器。

语法

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

OPTIONS说明:

  • -d :分离模式: 在后台运行

  • -i :即使没有附加也保持STDIN 打开

  • -t :分配一个伪终端

实例

在容器 mynginx 中以交互模式执行容器内 /root/runoob.sh 脚本:

runoob@runoob:~$ docker exec -it mynginx /bin/sh /root/runoob.sh
http://www.runoob.com/

在容器 mynginx 中开启一个交互模式的终端:

runoob@runoob:~$ docker exec -i -t  mynginx /bin/bash
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值