虚拟化是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以更好的应用这些资源。一般,虚拟化资源包括计算能力和资料存储。
虚拟化技术可以解决高性能的物理硬件产能过剩和老旧硬件产能过低的重组重用,透明化底层物理硬件,最大化利用物理硬件,充分利用资源。
Docker是一个开源项目,诞生于2013年初,基于go语言实现。Docker项目的目标是实现轻量级的操作虚拟化解决方案。Docker的基础是linux容器(LXC)等技术。在LXC的基础上docker做了进一步的封装,让用户不需要关心容器的管理,使得操作更为简便。
Docker的优点,上手快,职责逻辑分类,快速高效的开发周期,鼓励使用面向服务架构。与传统虚拟机相比,docker启动速度快,占用体积小。
Docker是一个客户端服务器架构。Docker客户端只需要向docker服务器或者守护进程发出请求,服务器或者守护进程将完成所有工作返回结果。Docker提供了一个命令工具docker以及一整套restful api。可以在同一台宿主机上运行docker守护进程和客户端,也可从本地的docker客户端连接到运行在另一个宿主机上的远程docker守护进程。
镜像是构建docker的基石。用户基于镜像来运行自己的容器。镜像是基于联合文件系统的一种层式结构,由一些一步一步构建出来。Docker可以构建和部署容器,把应用程序或者服务打包进容器即可。容器是基于镜像启动起来的,容器中可以运行一个或多个进程。
Docker用registry来保存用户构建的镜像。Registry分为公共和私有两种。Docker公司运行公共的registry叫做docker hub。用户可以在docker hub注册账号,分享并保存自己的镜像。
- 二,Docker安装与启动
1,安装
官方建议将docker安装在ubuntu中,因为基于ubuntu发布。如果安装到centos中,建议安装到centos7.x以上的版本中。
步骤
1)Yum包更新到最新
sudo yum update
2)安装需要的软件包,yum-util提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
3)设置yum源为阿里云
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4)安装docker
sudo yum install docker-ce
5)安装后查看版本
docker -v
6)设置ustc的镜像
Ustc是老牌的linux镜像服务提供者,ustc的docker镜像加速器速度很快。Ustc ducker mirror的优势之一是不需要注册。https://lug.ustc.edu.cn/wiki/mirrors/help/docker
编辑守护文件
vi /etc/docker/daemon.json
输入如下内容:
{"registry-mirrors":["https://docker.mirrors.ustc.edu.cn", "https://hub.daocloud.io","https://registry.docker-cn.com"],"storage-driver":"devicemapper"}
2,Docker的启动与停止
systemctl命令是系统服务器管理指令
启动docker
systemctl start docker
启动docker失败
报如下错:
Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.
执行systemctl status docker.service,如下:
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
Active: failed (Result: start-limit) since Sun 2019-12-08 13:20:43 EST; 2s ago
Docs: https://docs.docker.com
Process: 8345 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock (code=exited, status=1/FAILURE)
Main PID: 8345 (code=exited, status=1/FAILURE)
Dec 08 13:20:41 localhost.localdomain systemd[1]: docker.service: main process exited, code=exited, status=1/FAILURE
Dec 08 13:20:41 localhost.localdomain systemd[1]: Failed to start Docker Application Container Engine.
Dec 08 13:20:41 localhost.localdomain systemd[1]: Unit docker.service entered failed state.
Dec 08 13:20:41 localhost.localdomain systemd[1]: docker.service failed.
Dec 08 13:20:43 localhost.localdomain systemd[1]: docker.service holdoff time over, scheduling restart.
Dec 08 13:20:43 localhost.localdomain systemd[1]: Stopped Docker Application Container Engine.
Dec 08 13:20:43 localhost.localdomain systemd[1]: start request repeated too quickly for docker.service
Dec 08 13:20:43 localhost.localdomain systemd[1]: Failed to start Docker Application Container Engine.
Dec 08 13:20:43 localhost.localdomain systemd[1]: Unit docker.service entered failed state.
Dec 08 13:20:43 localhost.localdomain systemd[1]: docker.service failed.
并不能准确的提示错误的原因。于是执行dockerd
INFO[2019-12-08T13:25:22.941739986-05:00] Starting up
INFO[2019-12-08T13:25:22.945230659-05:00] parsed scheme: "unix" module=grpc
INFO[2019-12-08T13:25:22.945260708-05:00] scheme "unix" not registered, fallback to default scheme module=grpc
INFO[2019-12-08T13:25:22.945346707-05:00] ccResolverWrapper: sending update to cc: {[{unix:///run/containerd/containerd.sock 0 <nil>}] <nil>} module=grpc
INFO[2019-12-08T13:25:22.945361519-05:00] ClientConn switching balancer to "pick_first" module=grpc
INFO[2019-12-08T13:25:22.947830668-05:00] parsed scheme: "unix" module=grpc
INFO[2019-12-08T13:25:22.947865465-05:00] scheme "unix" not registered, fallback to default scheme module=grpc
INFO[2019-12-08T13:25:22.947892038-05:00] ccResolverWrapper: sending update to cc: {[{unix:///run/containerd/containerd.sock 0 <nil>}] <nil>} module=grpc
INFO[2019-12-08T13:25:22.947908923-05:00] ClientConn switching balancer to "pick_first" module=grpc
WARN[2019-12-08T13:25:22.955206580-05:00] [graphdriver] WARNING: the devicemapper storage-driver is deprecated, and will be removed in a future release
WARN[2019-12-08T13:25:22.969194790-05:00] Usage of loopback devices is strongly discouraged for production use. Please use `--storage-opt dm.thinpooldev` or use `man dockerd` to refer to dm.thinpooldev section. storage-driver=devicemapper
INFO[2019-12-08T13:25:23.202902286-05:00] Creating filesystem xfs on device docker-253:1-697253-base, mkfs args: [-m crc=0,finobt=0 /dev/mapper/docker-253:1-697253-base] storage-driver=devicemapper
INFO[2019-12-08T13:25:23.207985512-05:00] Error while creating filesystem xfs on device docker-253:1-697253-base: exit status 1 storage-driver=devicemapper
failed to start daemon: error initializing graphdriver: exit status 1
可以看到Error while creating filesystem xfs on device docker-253:1-697253-base: exit status 1,说明在创建xfs的时候出错了。这是由于系统xfsprogs版本过低造成的,更新一下即可:
yum install xfsprogs
再次启动docker,成功。
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
Active: active (running) since Sun 2019-12-08 13:32:34 EST; 1s ago
Docs: https://docs.docker.com
Main PID: 8649 (dockerd)
Memory: 42.1M
CGroup: /system.slice/docker.service
└─8649 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
Dec 08 13:32:34 localhost.localdomain dockerd[8649]: time="2019-12-08T13:32:34.788775621-05:00" level=warning msg="Usage of loopback devi...emapper
Dec 08 13:32:34 localhost.localdomain dockerd[8649]: time="2019-12-08T13:32:34.807063444-05:00" level=warning msg="Base device already ex...emapper
Dec 08 13:32:34 localhost.localdomain dockerd[8649]: time="2019-12-08T13:32:34.820213927-05:00" level=warning msg="mountpoint for pids not found"
Dec 08 13:32:34 localhost.localdomain dockerd[8649]: time="2019-12-08T13:32:34.820398645-05:00" level=info msg="Loading containers: start."
Dec 08 13:32:34 localhost.localdomain dockerd[8649]: time="2019-12-08T13:32:34.917216949-05:00" level=info msg="Default bridge (docker0) ...ddress"
Dec 08 13:32:34 localhost.localdomain dockerd[8649]: time="2019-12-08T13:32:34.957496981-05:00" level=info msg="Loading containers: done."
Dec 08 13:32:34 localhost.localdomain dockerd[8649]: time="2019-12-08T13:32:34.972186739-05:00" level=info msg="Docker daemon" commit=633...19.03.5
Dec 08 13:32:34 localhost.localdomain dockerd[8649]: time="2019-12-08T13:32:34.972251278-05:00" level=info msg="Daemon has completed init...zation"
Dec 08 13:32:34 localhost.localdomain dockerd[8649]: time="2019-12-08T13:32:34.989027383-05:00" level=info msg="API listen on /var/run/docker.sock"
Dec 08 13:32:34 localhost.localdomain systemd[1]: Started Docker Application Container Engine.
Hint: Some lines were ellipsized, use -l to show in full.
停止docker
systemctl stop docker
重启docker
systemctl restart docker
查看docker状态
systemctl status docker
3,设置开机自动启动docker
systemctl enable docker
4,Docker的卸载
1)查询docker安装过的包
yum list installed | grep docker
2)删除安装包
yum remove docker-ce.x86_64 docker-ce-cli.x86_64
3)删除镜像容器等
rm -rf /var/lib/docker
- 三,Docker常用命令
1,镜像相关的命令
1)查看镜像
docker images
2)搜索镜像
docker search 镜像名称
比如,docker search centos
3)拉取镜像
docker pull 镜像
比如下载centos7,docker pull centos:7,或者docker pull guyton/centos6
4)删除镜像
可以按照镜像名称或者id删除
docker rmi id
删除所有镜像
docker rmi `docker images -q`
2,容器相关的命令
1)查看容器
docker ps
查看所有容器
docker ps -a
查看最后一次运行的容器
docker ps -l
查看所有停止的容器
docker ps -f status=exited
2)创建与启动容器
创建容器命令:docker run
-i:表示运行容器
-t:表示容器启动后进入其他命令行。加入这两个参数后,容器创建就能登录进去,分配一个伪终端。
--name:为创建的容器命名
-v:表示目录映射关系(前者表示宿主机目录,后者表示映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。最好做目录映射,在宿主机上做修改,然后共享到容器上。
-d:在run后面加上-d参数,则会创建一个守护式容器在后台运行,这样创建的容器不会自动登录容器,如果只加-i -t两个参数,创建后就自动进去容器
-p:表示终端映射,前者是在宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射。
交互式方式创建容器
docker run -it --name-容器名称 镜像名称:标签 /bin/bash
docker run -it --name=mcentos centos:7 /bin/bash
守护式方式创建容器
docker run -id --name=容器名称 镜像名称:标签
docker run -id --name=mcentos2 centos:7
进入守护式容器的方式:docker exec -it 容器名称或者容器ID /bin/bash
3)容器的启动与停止
docker start 容器名称或者id
docker stop 容器名称或者id
4)文件拷贝
将文件拷贝到容器内
docker cp 需要拷贝的文件或目录 容器名称:容器目录
将容器内的文件拷贝出来
docker cp 容器名称:容器目录 需要拷贝的文件或目录
不论容器是否启动,都可以进行拷贝。
5)目录挂载
可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样就可以通过修改宿主机某个目录的文件从而去影响容器。
创建容器添加-v参数后边为宿主机目录:容器目录,例如:
docker run -di -v /usr/local/myhtml:/usr/local/myhtml --name=mycentos3 centos:7
如果共享的是多级目录,可能会出现权限不足的提示。因为centos7中的安全模块selinux把权限禁了,我们需要添加参数—privileged=true来解决挂载的目录没有权限的问题。
6)查看容器ip地址
查看容器运行的各种数据
docker inspect 容器名称或id
输入ip地址
docker inspect --format=’{{.NetworkSetting.IPAddress}}’ 容器名称或id
7)删除容器
docker rm 容器名称或id
删除容器前需要先停掉容器。docker stop 容器名称
- 四,应用部署
1,Mysql部署
拉取mysql镜像
docker pull centos/mysql-57-centos7
创建容器
docker run -di --name=mysql1 -p 33066:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql
-p表示端口映射,格式为宿主机映射端口:容器运行端口
-e表示添加环境变量 MYSQL_ROOT_PASSWORD是root用户的登录密码
2,Tomcat部署
拉镜像
docker pull tomcat:7-jre7
创建容器
docker run -di --name=mytomcat1 -p 9000:8080 -v /usr/local/webapps:/usr/local/tomcat/webapps tomcat:7-jre7
在宿主机的webapps目录下放war包,自动解压后就可以访问。
3,Nginx部署
拉镜像
docker pull nginx
创建容器
docker run -di --name=mynginx -p 80:80 nginx
4,redis部署
拉镜像
docker pull redis
创建容器
docker run -di --name=myredis -p 6379:6379 redis
- 五,迁移与备份
1,容器保存为镜像
docker commit mytomcat mytomcat_i
2,镜像备份
docker save -o mytomcat.tar mytomcat_i
3,镜像回复与迁移
docker load -i mytomcat.tar
-i 表示输入的文件
- 六,Dockerfile
Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。
1,常用命令
FROM image_name:tag 定义了使用哪个基础镜像启动构建流程
MAINTRAINER user_name 声明镜像的创建者
ENV key value 设置环境变量(可以写多条)
RUN command 是Dockerfile的核心,可以多条
ADD source_dir/file dest_dir/file 将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压
COPY source_dir/file dest_dir/file 和ADD相似,但是如果是压缩文件并不能解压
WORKDIR path_dir 设置工作目录
2,使用脚本创建镜像
使用Dockerfile构建jdk镜像
mkdir /usr/local/dockerjdk8
进入dockerjdk8目录,copy一份jdk的压缩包进来这个目录,创建Dockerfile文件,内容如下:
FROM centos:7
MAINTAINER SSS
WORKDIR /usr
RUN mkdir /usr/local/java
ADD jdk-8u60-linux-x64.gz /usr/local/java/
ENV JAVA_HOME /usr/local/java/jdk1.8.0_60
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/bin/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
在dockerjdk8目录下执行命令:
docker build -t='jdk1.8' .
- 七,Docker私有仓库
1,私有仓库搭建与配置
拉取私有仓库镜像
docker pull registry
启动私有仓库
docker run -di --name=registry -p 5000:5000 registry
打开浏览器输入地址http://192.xxx.x.xxx:5000/v2/_catalog看到{"repositories":[]}表示私有仓库搭建成功并且内容为空。
修改daemon.json
vi /etc/docker/daemon.json
添加如下内容:
{"insecure-registries":["192.xxx.x.xxx:5000"]}
用于让docker信任私有仓库地址
2,私有仓库镜像上传
首先对需要上传的镜像打标签
docker tag jdk1.8 192.xxx.x.xxx:5000/jdk1.8
然后push
docker push 192.xxx.x.xxx:5000/jdk1.8
- 八,Docker maven插件
微服务部署有两种方式,手动部署,首先打成jar包或war包,然后将包上传至虚拟机或拷贝至容器。
通过maven插件自动部署。
Maven插件自动部署步骤:
1,修改宿主机的docker配置,让其可以远程访问
vi /lib/systemd/system/docker.service
其中ExecStart后添加配置-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
2,刷新配置,重启服务
systemctl daemon-reload
systemctl restart docker
docker start registry
3,配置pom文件,添加
<build>
<finalName>app</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‐boot‐maven‐plugin</artifactId>
</plugin>
<!--docker的maven插件,官网:https://github.com/spotify/docker‐maven‐plugin-->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker‐maven‐plugin</artifactId>
<version>0.4.13</version>
<configuration>
<imageName>192.168.184.141:5000/${project.artifactId}:${project.version}
</imageName>
<baseImage>jdk1.8</baseImage>
<entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]
</entryPoint>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}
</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
<dockerHost>http://192.168.184.141:2375</dockerHost>
</configuration>
</plugin>
</plugins>
</build>
以上配置自动生成Dockerfile
FROM jdk1.8
ADD app.jar /
ENTRYPOINT ["java", "-jar", "/app.jar"]
4,打包和上传镜像
使用mvn构建工程,mvn install
进入相应工程目录,执行mvn docker:build -DpushImage
5,进入宿主机,查看镜像
docker images
浏览器查看私有仓库http://192.xxx.xx.xxx:5000/v2/_catalog
6,启动容器
docker run -di --name=base -p 9001:9001 镜像名称
来源:CSDN
作者:dchaofang
链接:https://blog.csdn.net/xingzhishen/article/details/103467431