赞
踩
在实际开发过程中,会出现很多环境:开发环境、测试环境以及生产环境。
那么我们如何解决这个“水土不服”的问题?我们可以将软件带环境安装,来解决这种问题。
带环境安装。软件可以带环境安装?也就是说,开发人员要交付的是代码和环境,运维人员部署的时候把原始环境一模一样地复制过来。
Docker 是一个开源的应用容器引擎,使应用程序可以在不同的环境中运行,而不需要修改代码。
诞生于2013 年初,基于 Go 语言实现,dotCloud 公司出品
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,实现了“Build,Ship and Run Any App,Anywhere”的目标。
Docker从17.03 版本之后分为 CE(Community Edition: 社区版)和EE(Enterprise Edition: 企业版)。
虚拟机:运行在一个操作系统里的另一个操作系统(centos),缺点:占用资源多,启动慢
容器:是一种虚拟化技术,不是一个完整版本的操作系统,优点:占用资源少,启动快Docker运行在容器上,是一个mini版的linux,可以使程序在不同的环境中运行。
概念 | 说明 |
---|---|
docker镜像(Images) | 软件打包好的用于创建 Docker 容器的模板[类] |
docker容器(Container) | 运行中的镜像称为容器[对象] |
docker仓库(Registry) | 用来保存各种打包好的软件镜像 |
查看内核版本,docker要求linux内核3.8以上
[root@localhost ~]# uname -a
把yum包更新到最新
[root@localhost ~]# yum update #可省略
安装切换仓库地址的软件包,yum-util 提供yum-config-manager功能
yum install -y yum-utils
切换仓库地址到阿里云
[root@localhost ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum -y install docker-ce
启动和关闭命令
启动:
[root@localhost ~]# systemctl start docker #起动
查看状态:
[root@localhost ~]# systemctl status docker #状态
停止:
[root@localhost ~]# systemctl stop docker #关闭
重启:
[root@localhost ~]# systemctl restart docker #重启docker
设置docker开机自启动:
[root@localhost ~]# systemctl enable docker
配置阿里云镜像加速
docker默认从Docker Hub(https://hub.docker.com)下载镜像,一般都会配置镜像加速器:
1.登录阿里云(http://dev.aliyun.com)
2.在控制台搜索容器镜像服务
3.找到镜像加速器
4、配置镜像加速
[root@localhost ~]# sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://crhn72f8.mirror.aliyuncs.com"]
}
EOF
[root@localhost ~]# sudo systemctl daemon-reload
[root@localhost ~]# sudo systemctl restart docker
[root@localhost ~]#
5.测试
[root@localhost ~]# docker info
... ...
Registry Mirrors:
https://crhn72f8.mirror.aliyuncs.com/
语法:
docker search IMAGE
案例:
[root@localhost /]# docker search tomcat
NAME DESCRIPTION STARS OFFICIAL
tomcat Apache Tomcat... 3669 [OK]
tomee Apache TomEE i.. 115 [OK]
...#省略其他非官方镜像
从Docker仓库下载镜像到本地,镜像名称格式为 名称:版本号,如果版本号不指定则是最新的版本(latest)。如果不知道镜像版本,可以去hub.docker.com 搜索对应镜像查看。
语法:
docker pull IMAGE:TAG
列出本地主机上的镜像
语法:
docker images
案例:
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat 8.5.100 0a2249be3d31 8 weeks ago 456MB
centos 7 eeb6ee3f44bd 2 years ago 204MB
使用 docker rmi 命令删除镜像。
语法:
docker rmi IMAGE[:tag]
案例:
[root@localhost /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat 8.5.100 0a2249be3d31 8 weeks ago 456MB
tomcat latest fb5657adc892 2 years ago 680MB
centos 7 eeb6ee3f44bd 2 years ago 204MB
[root@localhost /]# docker rmi tomcat:latest
Untagged: tomcat:latest
Untagged: tomcat@sha256:9dee185c3b161cdfede1f5e35e8b56ebc9de88ed3a79526939701f3537a52324
Deleted: sha256:fb5657adc892ed15910445588404c798b57f741e9921ff3c1f1abe01dbb56906
...#删除过程省略
[root@localhost /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat 8.5.100 0a2249be3d31 8 weeks ago 456MB
centos 7 eeb6ee3f44bd 2 years ago 204MB
语法:
docker run [options] IMAGE[:TAG]
OPTIONS:
–name:为容器指定一个名称
-p:指定端口映射,hostPost:containerPort 新建并启动同一个版本的镜像并指定端口映射时,只有一个会生效
docker run -d --name tomcat_1 -p 8080:8080 tomcat:8.5.100 #生效
docker run -d --name tomcat_2 -p 8080:8080 tomcat:8.5.100 #未生效
-d:后台模式运行容器
案例:
[root@localhost /]# docker run -d --name tomcat_1 -p 8080:8080 tomcat:8.5.100
4b65438f949cafa0694121c6f67066586bc0c7886a6706ee53f66c2f3c39ba42
语法:
docker ps [options]
OPTIONS说明:
[root@localhost ~]# docker ps
[root@localhost ~]# docker ps -a
语法:
docker stop CONTAINER NAME #速度快
或
docker kill CONTAINER NAME #不推荐使用,容易造成容器服务不正常关闭,影响后续使用。速度慢
案例:
语法:
docker start CONTAINER NAME
例如:
[root@localhost ~]# docker start tomcat_1
tomcat_1
语法:
docker rm CONTAINER NAME
例如:
[root@localhost ~]# docker rm tomcat_1
tomcat_1
语法:
docker exec [options] CONTAINER NAME [command]
exec说明:
OPTIONS说明:
command说明:
案例:
[root@localhost /]# docker exec -it tomcat_1 /bin/bash root@4b65438f949c:/usr/local/tomcat# ll total 132 #...省略其他文件夹 drwxrwxrwt. 2 root root 30 Mar 28 05:37 temp/ drwxr-xr-x. 2 root root 6 Mar 28 05:37 webapps/ drwxr-xr-x. 7 root root 81 Mar 19 13:54 webapps.dist/ drwxrwxrwt. 2 root root 6 Mar 19 13:54 work/ root@4b65438f949c:/usr/local/tomcat# rm -rf webapps root@4b65438f949c:/usr/local/tomcat# mv webapps.dist webapps root@4b65438f949c:/usr/local/tomcat# ll total 132 #...省略其他文件夹 drwxrwxrwt. 2 root root 30 Mar 28 05:37 temp/ drwxr-xr-x. 7 root root 81 Mar 19 13:54 webapps/ drwxrwxrwt. 2 root root 6 Mar 19 13:54 work/
语法:
docker inspect CONTAINER NAME
案例:
#查询容器详细信息中包括id的信息 -i不区分大小写 [root@localhost /]# docker inspect tomcat_1 | grep -i 'id' "Id": "4b65438f949cafa0694121c6f67066586bc0c7886a6706ee53f66c2f3c39ba42", "Pid": 12511, "ExecIDs": null, "ContainerIDFile": "", "NetworkMode": "bridge", "PidMode": "", "PidsLimit": null, "IOMaximumBandwidth": 0, "Bridge": "", "SandboxID": "1c45c128f241e0e9faeab836b95404b4c68ae0f8a8f02a880f7e0f8cda1a2ae6", "EndpointID": "bfda11240ada4392bd73ff89f9564b417162f3c9d5d443b65e9d013156548283", "bridge": { "NetworkID": "024b9d1353f032e980cc5713b522b1ad8a6f740f2e8f8da52aae31621228992a", "EndpointID": "bfda11240ada4392bd73ff89f9564b417162f3c9d5d443b65e9d013156548283",
语法:
docker logs CONTAINER NAME
案例:
[root@localhost /]# docker logs tomcat_1
docker容器删除后,在容器中产生的数据还在吗? 比如我在redis的容器里面存储了数据,删除了redis容器之后,数据是否还在?
docker容器和外部机器可以直接交换文件吗? 比如我们可以在windows里面编写代码之后,直接部署tomcat容器里面吗?
数据卷是宿主机中的一个目录或文件,数据卷设计的目的在于数据的持久化和共享数据,它完全独立于容器的生存周期;作用是容器数据持久化、外部机器和容器之间数据交换;
创建启动容器时,使用 –v 参数 设置数据卷。如果目录不存在,会自动创建。
docker run –v 宿主机目录:容器内目录
建立一个名为t1的容器,并挂载宿主机目录/root/data_host,对应容器目录/root/data_container
[root@localhost /]# docker run --name t1 -id -v /root/data_host:/root/data_container tomcat:8.5.100
872b2f9171eae26f214a13e9cc7a0faa2db21fa2c9e60614b0f35cef2853d37a
[root@localhost /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
872b2f9171ea tomcat:8.5.100 "catalina.sh run" 7 seconds ago Up 5 seconds 8080/tcp t1
在宿主机data_host目录里面创建一个文件,检查容器的data_container目录是否同步
[root@localhost /]# cd /root/data_host [root@localhost data_host]# ll 总用量 0 -rw-r--r--. 1 root root 0 5月 24 17:17 a.txt -rw-r--r--. 1 root root 0 5月 24 17:18 b.txt [root@localhost data_host]# touch t1.txt [root@localhost data_host]# ll 总用量 0 -rw-r--r--. 1 root root 0 5月 24 17:17 a.txt -rw-r--r--. 1 root root 0 5月 24 17:18 b.txt -rw-r--r--. 1 root root 0 5月 25 14:04 t1.txt [root@localhost data_host]# docker exec -it t1 /bin/bash root@872b2f9171ea:/usr/local/tomcat# cd /root/data_container root@872b2f9171ea:~/data_container# ll total 0 drwxr-xr-x. 2 root root 46 May 25 06:04 ./ drwx------. 1 root root 28 May 25 06:00 ../ -rw-r--r--. 1 root root 0 May 24 09:17 a.txt -rw-r--r--. 1 root root 0 May 24 09:18 b.txt -rw-r--r--. 1 root root 0 May 25 06:04 t1.txt
创建容器t2,挂载data_host数据卷,宿主机作为中转,t1和宿主机挂载,t2和宿主机挂载,t1也就和t2实现数据共享了,此时 t1,t2宿主机数据同时变化
[root@localhost data_host]# docker run -d --name t2 -v /root/data_host:/root/data_container tomcat:8.5.100
d7139da2b508e0841411b5a8720bcfea70180c2149011b38db9a1135abfef20f
在t2中创建新的文件,看看t1中是否存在该文件
[root@localhost data_host]# docker exec -it t2 /bin/bash root@d7139da2b508:/usr/local/tomcat# cd /root/data_container root@d7139da2b508:~/data_container# touch t2.txt root@d7139da2b508:~/data_container# ll total 0 drwxr-xr-x. 2 root root 60 May 25 06:15 ./ drwx------. 1 root root 28 May 25 06:13 ../ -rw-r--r--. 1 root root 0 May 24 09:17 a.txt -rw-r--r--. 1 root root 0 May 24 09:18 b.txt -rw-r--r--. 1 root root 0 May 25 06:04 t1.txt -rw-r--r--. 1 root root 0 May 25 06:15 t2.txt [root@localhost data_host]# docker exec -it t1 /bin/bash root@872b2f9171ea:/usr/local/tomcat# cd /root/data_container root@872b2f9171ea:~/data_container# ll total 0 drwxr-xr-x. 2 root root 60 May 25 06:15 ./ drwx------. 1 root root 49 May 25 06:12 ../ -rw-r--r--. 1 root root 0 May 24 09:17 a.txt -rw-r--r--. 1 root root 0 May 24 09:18 b.txt -rw-r--r--. 1 root root 0 May 25 06:04 t1.txt -rw-r--r--. 1 root root 0 May 25 06:15 t2.txt root@872b2f9171ea:~/data_container# exit [root@localhost data_host]# ll 总用量 0 -rw-r--r--. 1 root root 0 5月 24 17:17 a.txt -rw-r--r--. 1 root root 0 5月 24 17:18 b.txt -rw-r--r--. 1 root root 0 5月 25 14:04 t1.txt -rw-r--r--. 1 root root 0 5月 25 14:15 t2.txt
此时t1,t2宿主机都有在t2中创建的t2.txt文件,实现数据共享
外部机器网络怎么访问容器内部网络服务?
外部机器可以直接访问宿主机网络服务,再将容器的端口号映射到宿主机上,以此实现外部机器访问容器的网络服务,这种方法称为容器映射
拉取mysql镜像
docker pull mysql:5.7
创建容器,\是续写,在下一行继续写
docker run -p 3306:3306 --name mysql \
-v /usr/local/docker/mysql/data:/var/lib/mysql \ #挂载
-e MYSQL_ROOT_PASSWORD=1111 \ #指定mysql的root用户的登录密码
-d mysql:5.7
mysql安装完毕,外部机器测试连接容器
Dockerfile本质上是一个文本文件,其内包含了一条条的指令(Instruction),用于构建镜像。每一条指令构建一层镜像,因此每一条指令的内容,就是描述该层镜像应当如何构建。
指令 | 说明 | Build | Both | Run |
---|---|---|---|---|
FROM | 指定构建使用的基础镜像,FROM命令必须写在其他的指令前 | √ | ||
EXPOSE | 声明容器对外暴露的端口号,只是声明,指定端口号需要-p | √ | ||
ENV | 设置环境变量,可以在容器内获取使用 | √ | ||
WORKDIR | 终端默认的工作目录 | √ | ||
VOLUME | 使容器内的一个目录具有持久化存储的功能 | √ | ||
RUN | 容器构建时需要运行的命令 | √ | ||
CMD | 指定一个容器启动时要运行的命令,如果指定了多条CMD 命令,则只有最后一条会被执行;CMD会被docker run之后的参数替换。 | √ | ||
ENTRYPOINT | 同CMD ,但docker run之后的参数会传递给ENTRYPOINT形成新的命令组合。 | √ | ||
ADD | 从宿主机复制文件到容器中,并自动提取压缩格式的文件,自动解压 | √ | ||
COPY | 类似于ADD,不支持压缩包 | √ | ||
MAINTAINER | 用于为Dockerfile署名 | √ | ||
ONBUILD | 当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后,父镜像的onbuild被触发。 | √ |
语法:
docker build [OPTIONS] PATH .
OPTIONS:
例如:
docker build -f DockerFile -t mycentos:1.0
语法:
docker save -o 压缩包 自定义镜像名称:TAG
例如:
docker save -o mycentos.1.0.rar mycentos:1.0
语法:
docker load -i 压缩包
例如:
docker load -i mycentos.1.0.rar
docker history mycentos:1.0
编写DockerFile文件
[root@localhost ~]# mkdir /usr/local/docker [root@localhost ~]# cd /usr/local/docker [root@localhost docker]# vim Dockerfile #继承centos:7 FROM centos:7 #署名 MAINTAINER mgw<mgw@126.com> #配置变量 ENV MYPATH /usr/local #指定工作路径,也就是登录后的默认路径 WORKDIR $MYPATH #下载vim编辑器和支持网络配置的工具 RUN yum -y install vim RUN yum -y install net-tools
构建DockerFile,自定义镜像
[root@localhost docker]# docker build -f Dockerfile -t mycentos:1.0 .
运行测试
[root@localhost docker]# docker run -it --name mycentos mycentos:1.0 [root@1eaed8189758 local]# vim a.txt [root@1eaed8189758 local]# pwd /usr/local [root@1eaed8189758 local]# ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255 ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet) RX packets 6 bytes 516 (516.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 #省略ifconfig的后续内容 #压缩镜像 [root@localhost docker]# docker save -o mycentos.1.0.rar mycentos:1.0 [root@localhost docker]# ls Dockerfile mycentos.1.0.rar mysql redis tomcat #解压镜像 [root@localhost docker]# docker rmi mycentos:1.0 [root@localhost docker]# docker load -i mycentos.1.0.rar [root@localhost webapps]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE mycentos 1.0 6f97e2ccdab1 5 hours ago 727MB
上传安装包和文件
注意:Docker File要跟安装包在同一目录下
编写DockerFile
FROM centos:7 MAINTAINER mgw<mgw@126.com> # 把Java与Tomcat添加到容器中 ADD jdk-8u191-linux-x64.tar.gz /usr/local/ ADD apache-tomcat-8.5.100.tar.gz /usr/local/ # 安装vim编辑器 RUN yum -y install vim # 设置工作访问时候的WORKDIR路径,登录落脚点 ENV MYPATH /usr/local WORKDIR $MYPATH # 配置Java ENV JAVA_HOME /usr/local/jdk1.8.0_191 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.100 ENV CATALINA_BASE /usr/local/apache-tomcat-8.5.100 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin # 容器运行时监听的端口 EXPOSE 8080 # 启动时运行Tomcat CMD ["/bin/bash", "-c", "/usr/local/apache-tomcat-8.5.100/bin/startup.sh && tail -F /usr/local/apache-tomcat-8.5.100/logs/catalina.out"]
测试
#构建
[root@localhost docker]# docker build -f DockerFile3 -t mycentos:1.3 .
[+] Building 0.5s (10/10) FINISHED docker:default
=> [internal] load build definition from DockerFile3 #省略vim等安装过程
#新建并启动容器,端口映射8080,name为tomcat3,挂载两次
[root@localhost docker]# docker run -d -p 8080:8080 --name tomcat3 \
> -v /usr/local/docker/tomcat/webapps/:/usr/local/apache-tomcat-8.5.100/webapps/ \
> -v /usr/local/docker/tomcat/logs/:/usr/local/apache-tomcat-8.5.100/logs/ \
> mycentos:1.3
本地给/usr/local/docker/tomcat/webapps/目录里上传test文件夹,此时挂载的文件夹/usr/local/apache-tomcat-8.5.100/webapps/里也应存在test目录
[root@localhost webapps]# docker exec -it tomcat3 /bin/bash
[root@f7c1943cc3a2 local]# pwd
/usr/local
[root@f7c1943cc3a2 local]# cd /usr/local/apache-tomcat-8.5.100/webapps/
[root@f7c1943cc3a2 webapps]# ll
total 0
drwxr-xr-x. 2 root root 23 May 27 09:37 test
此时外部机器也可以访问tomcat服务
[root@localhost docker]# docker run -d -p 8080:8080 --name tomcat3 \
-v /usr/local/docker/tomcat/webapps/:/usr/local/apache-tomcat-8.5.100/webapps/
-v /usr/local/docker/tomcat/logs/:/usr/local/apache-tomcat-8.5.100/logs/
mycentos:1.3
> 本地给/usr/local/docker/tomcat/webapps/目录里上传test文件夹,此时挂载的文件夹/usr/local/apache-tomcat-8.5.100/webapps/里也应存在test目录
[外链图片转存中...(img-tBI2iByo-1716811848263)]
~~~bash
[root@localhost webapps]# docker exec -it tomcat3 /bin/bash
[root@f7c1943cc3a2 local]# pwd
/usr/local
[root@f7c1943cc3a2 local]# cd /usr/local/apache-tomcat-8.5.100/webapps/
[root@f7c1943cc3a2 webapps]# ll
total 0
drwxr-xr-x. 2 root root 23 May 27 09:37 test
此时外部机器也可以访问tomcat服务
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。