目录
什么是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
一、创建工作目录
创建目录的目的,用于区分不同镜像的构建。相当于工作空间。
[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