初识docker容器
docker是什么?
百度百科是这样跟我说的:Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口 。
相信刚接触docker的你,肯定是很懵逼;
那么,我们在来看下面这一段话,从docker的logo下手,
如果非要我用一句话描述这张图片,还在上幼儿园的我会说:“一条可爱的鲸鱼背着多个集装箱,畅游在大海里 ”!而现在我会说:“docker是一个运行在操作系统上的软件,这个软件上面可以运行多个相互隔离的容器”!不同的表述,同一个意思!这条可爱的鲸鱼就是咱们的docker,而大海就是我们的操作系统,多个集装箱就是在docker上运行的容器!什么是容器咱们后面会说~~~
假如你想漂洋过海来看我,你可以选择自己造一条船,这样你就得自己备足很多干粮,还得准备很多一些其他的必需品才能出发!但是现在有一条鲸鱼游过来对你说,我这里有很多集装箱,里面有你所需要的一切,你选一个适合你的进来就可以了,我会带你乘风破浪的!
emmm,是不是一下子对觉得docker很容易理解了!
docker可以做什么?
- 使用docker可以巧妙的解决开发和运维之间的矛盾,不在至于代码在开发可以使用,一上线就不可用的情况,实现开发人员把代码的换环境打包,到哪里都可以运行的理念;
- 减少运维工作人员的压力,服务器环境弹性扩容时,在一台docker部署好后,整体打包做成镜像上传到docker hub,直接pull拉取使用即可
docker和传统虚拟机对比
传统虚拟机以VMware或kvm为例,我们需要给虚拟机分配CPU,内存,硬盘等资源,宿主机必须支持CPU虚拟化才可以,而且极其占用宿主机性能等等缺陷,docker不会, docker容器内的应用程序是直接运行于宿主的内核,容器没有自己的内核,更加不会对硬件进行虚拟。因此docker容器比传统的虚拟机更为轻便!
对比如下:
如图所示,docker就是一个运行在操作系统的软件!!!
其他区别如下:
特性 | docker容器 | kvm虚拟机 |
---|---|---|
启动速度 | 秒级 | 分钟级 |
计算机消耗 | 几乎无 | 50%左右 |
性能 | 接近原生 | 弱 |
系统支持量 | 上千个 | 几十个 |
隔离性 | 容器之间互相隔离 | 完全隔离 |
docker组成元素
到现在,相信聪明的你肯定有了个大致的印象的吧,但是到现在为止,我们来看一下docker的核心组件,docker是一个client-server的架构!
docker客户端
docker客户端是用户与docker服务交互的窗口,我们能看到图中就是各种操作的命令!
可以和docker服务端在同一台主机,也可以远程连接docker服务,类似于MySQL的navicat
docker服务
中间的是docker后台运行的服务,一个称为docker daemon的守护进程 , docker deamon监听着客户端的请求,并且管理着docker的镜像、容器、网络、磁盘(图中只列出了镜像与容器)等对象 ;
仓库(Registry)
Docker仓库 ( Repository ) 是用来集中保存镜像的地方,当创建了自己的镜像之后,可以使用push命令将它上传到公有仓库( Public)或者私有仓库( Private),这样一来当下次要在另外一台机器上使用这个镜像时,只需要从仓库上拉取下来就可以了。
容器
Docker的容器( Container)是从镜像创建的运行实例。它可以被启动、停止和删除。所创建的每个容器都是相互隔离、互不可见,可以保证安全性的平台。可以把容器看作一个简易版的 Linux环境, Docker利用容器来运行和隔离应用。
镜像
Docker的镜像 ( image ) 是创建容器的基础, 是一个只读模板,可以用来创建docker容器, 类似虚拟机的快照,可以理解为是一个面向 Docker容器引擎的只读模板。比如一个镜像可以是一个完整的 Centos操作系统环境,称为一个 Centos镜像:可以是一个安装了MySQL的应用程序,称为一个MySQL镜像,等等,我们可以把所需要的一切都打包成镜像, 打包后的镜像在某台机器上能运行,那它就能够在任何装有docker的机器上运行 。
部署docker
docker官网地址:https://docs.docker.com/engine/install/centos/
先清除原来的docker
yum -y remove docker docker-*
docker官网下载很慢,我们换用阿里云的yum源
阿里云新镜像站地址: https://developer.aliyun.com/mirror/
#下载必要的系统工具
yum install -y yum-utils device-mapper-persistent-data lvm2
#添加repo源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#更新并安装Docker-CE
yum makecache fast
yum install docker-ce-18.09.0 docker-ce-cli-18.09.0 -y
#查看docker版本
# yum list docker-ce --showduplicates | sort -r
#开启Docker服务
service docker start
service docker enable
# 注意:
# 官方软件源默认启用了最新的软件,您可以通过编辑软件源的方式获取各个版本的软件包。例如官方并没有将测试版本的软件源置为可用,您可以通过以下方式开启。同理可以开启各种测试版本等。
# vim /etc/yum.repos.d/docker-ee.repo
# 将[docker-ce-test]下方的enabled=0修改为enabled=1
#
# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# yum list docker-ce.x86_64 --showduplicates | sort -r
# Loading mirror speeds from cached hostfile
# Loaded plugins: branch, fastestmirror, langpacks
# docker-ce.x86_64 17.03.1.ce-1.el7.centos docker-ce-stable
# docker-ce.x86_64 17.03.1.ce-1.el7.centos @docker-ce-stable
# docker-ce.x86_64 17.03.0.ce-1.el7.centos docker-ce-stable
# Available Packages
# Step2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.0.ce.1-1.el7.centos)
# sudo yum -y install docker-ce-[VERSION]
配置阿里云镜像加速器
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://rbf32i73.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker
查看版本
[root@localhost ~]# docker version
Client:
Version: 18.09.0
API version: 1.39
Go version: go1.10.4
Git commit: 4d60db4
Built: Wed Nov 7 00:48:22 2018
OS/Arch: linux/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 18.09.0
API version: 1.39 (minimum version 1.12)
Go version: go1.10.4
Git commit: 4d60db4
Built: Wed Nov 7 00:19:08 2018
OS/Arch: linux/amd64
Experimental: false
看到这里,说明已经镜像加速已经配置配置ok!
docker 帮助命令
docker version:查看docker版本
docker info:查看docker详细信息
docker --help 帮助手册
镜像命令
docker images 查看本地主机上所有的镜像
docker images tomcat 查看指定的镜像
docker rmi -f 删除本地的镜像
docker rmi -f $(docker images -qa) 删除所有的镜像
docke search 根据镜像名称搜索远程仓库的镜像
docker pull 拉取镜像
docker push 上传镜像
docker上传镜像到仓库
改标签和镜像名字
PS:镜像必须以docker.hub自己账号名开头
登录自己的账号
[root@docker01 ~]# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: hbhdlzs
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
[root@docker01 ~]# docker tag mycentos:nginx hbhdlzs/mycentos:centos7
[root@docker01 ~]# docker push hbhdlzs/mycentos:centos7
The push refers to repository [docker.io/hbhdlzs/mycentos]
3da9897ebbf4: Pushing 136.2MB/153.6MB
edf3aa290fb3: Pushing 148.6MB/203.3MB
等待上传完成即可!
容器命令
docker run [options] image 基于一个镜像开启一个容器
-d:在后台运行一个容器
-i:已交互模式运行容器
-t:给容器分配一个伪终端
-P:随机指定映射端口
-p:指定端口映射,格式:主机端口:容器端口
-v:建立宿主机与容器目录同步
--name="mysql": 伪容器指定一个名字(如果不指定会有一个随机名字)
--restart=always : 始终保持运行(随着docker开启而运行)
开启一个容器
[root@docker01 ~]# docker run -itd --name mysql1 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123.com mysql:5.7
3669a2f9adc7d9dcfbae2ecc45ff6d432cf4d1ae7dfc7caa5229265869c52797
[root@docker01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b1567ec426ac tomcat:latest "catalina.sh run" 3 hours ago Up 3 hours 0.0.0.0:8080->8080/tcp tomcat
e790384f7886 mysql:5.7 "docker-entrypoint.s…" 3 hours ago Up 3 hours 0.0.0.0:3306->3306/tcp, 33060/tcp mysql01
fb3ac35a3c16 centos:7 "/bin/bash" 4 hours ago Up 4 hours test
docker ps: 查看正在运行的容器
docker ps -a:查看运行与停止的所有容器
docker attach:再次进入容器
docker exec :同attach,比attach强大,可以在宿主机上直接操作
docker exec -it id /bin/bash:进入容器
docker stop:停止容器
docker start:开启容器
docker rm -f:删除容器
docker ps -a -q | xargs docker rm -f:删除所有的容器
docker inspect:查看容器的详情(也可以查看镜像)
在后台运行一个容器后,如果退后以后需要进入容器
attach进入容器
[root@docker02 ~]# docker attach 48ee820f4656
[root@48ee820f4656 /]# pwd
/
[root@48ee820f4656 /]# cd /tmp && ls -l
total 4
-rwx------. 1 root root 836 May 4 15:37 ks-script-AYCfEl
-rw-------. 1 root root 0 May 4 15:35 yum.log
退出容器
#exit——退出当前进入的容器到宿主机终端,但attach进入时会退出会关闭容器
#Ctrl+P+Q——退出当前的容器到宿主机终端,exec或attach进入退出时都不会关闭容器
[root@48ee820f4656 ~]# exit
exit
[root@docker02 ~]#
[root@docker02 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fdf8510f5b9d nginx:latest "/docker-entrypoint.…" 4 hours ago Up 4 hours 0.0.0.0:80->80/tcp nginx
exec进入容器
[root@docker02 ~]# docker exec -it 48ee820f4656 /bin/bash
[root@48ee820f4656 /]# pwd
/
[root@48ee820f4656 /]# cd /tmp && ll
total 4
-rwx------. 1 root root 836 May 4 15:37 ks-script-AYCfEl
-rw-------. 1 root root 0 May 4 15:35 yum.log
远程命令操作容器,不进入容器
[root@docker02 ~]# docker exec -it 48ee820f4656 ls -l /tmp
total 4
-rwx------. 1 root root 836 May 4 15:37 ks-script-AYCfEl
-rw-------. 1 root root 0 May 4 15:35 yum.log
[root@docker02 ~]#
查看容器的日志
docker logs id (-t -f --tail)
-t:显示时间
-f:持续监控
--tail:自定义显示多少行
查看容器内的运行进程
容器内就是一个简易的Linux内的运行环境,linux命令基本都可以使用
docker top id
查看容器运行细节
docker inspect id
容器与宿主机实现文件互传
docker cp id:/tmp/yum.repo /root
[root@docker02 ~]# docker cp 48ee820f4656:/tmp/yum.log /tmp
[root@docker02 ~]# cd /tmp/
[root@docker02 tmp]# ls
systemd-private-978f9c95e01e483bafbf6574da3ef577-colord.service-HId5Fr systemd-private-978f9c95e01e483bafbf6574da3ef577-rtkit-daemon.service-ca3LK1 yum.log
systemd-private-978f9c95e01e483bafbf6574da3ef577-cups.service-XBEqVK systemd-private-978f9c95e01e483bafbf6574da3ef577-vmtoolsd.service-pW7AJO
宿主机传输给容器
[root@docker01 ~]# docker cp nginx-1.17.5.tar.gz dc01:/root
docker commit自定义镜像
docker commit 提交容器副本使之成为一个新的镜像
docker commit -a=“作者” -m=“描述” 容器id 新的镜像名:标签
[root@docker02 ~]# docker exec -it 5259a337eaff /bin/bash
root@5259a337eaff:/usr/local/tomcat# pwd
/usr/local/tomcat
root@5259a337eaff:/usr/local/tomcat# cd webapps/
root@5259a337eaff:/usr/local/tomcat/webapps# rm -rf docs/
此时,给当前tomcat提交
[root@docker02 ~]# docker commit -a="zsgg" -m="rm -f docs" 5259a337eaff mytomcat:9
sha256:b77837f8f5ab610660858a99e0f2bc9de8b78548aa49936bf4b4b091ca2b7cc3
[root@docker02 ~]#
[root@docker02 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mytomcat 9 b77837f8f5ab 11 seconds ago 649MB
tomcat latest df72227b40e1 2 days ago 647MB
nginx latest 0901fa9da894 8 days ago 132MB
[root@docker02 ~]# docker run -it -p 7788:8080 mytomcat:9
容器数据卷——持久化
上面说到容器是一个简易版的linux系统和运行在其中的应用程序,那我们的应用程序产生的数据(比如操作日志、异常日志、数据)也是在容器内的系统中存放的,默认不会做持久化 ,如果鲸鱼(docker)造反了
随着容器的关闭,容器内的数据也会丢失,重新开启的容器不会加载原来的数据(简单说就是容器重新启动又是另外一个实例了)。那对容器内的数据需要持久化到宿主机上就很有必要了
容器数据卷的设计目的就是做数据的持久化和容器的数据共享,数据卷完全独立于容器的生命周期,也就是说就算容器 关闭或者删除,数据也不会丢失,简单点就是说将宿主机的目录挂载到容器,应用在容器的数据可以同步在宿主机磁盘上,这样容器内的产生的数据就可以持久化了
docker run -it -v /宿主机绝对路径:/容器内的目录 镜像名
[root@docker02 ~]# docker run -it --name dc01 -v /mydatavolume:/datavolumeConrtainer centos:7
给容器只读权限
docker run -it -v /宿主机绝对路径:/容器内的目录:ro 镜像名
数据卷容器—— volumes-from
数据卷容器是什么?
挂载父容器实现数据共享的容器叫做数据卷容器
容器到容器之间实现数据共享,通过挂载父容器实现子子代代继承父容器并且当父容器关闭时,也不会影响其他容器之间共享
如果父容器(dc01)已经做过了持久化,和宿主机实现了共享,那么继承父容器的容器也会都会和宿主机同步共享
[root@docker02 ~]# docker run -it --name dc03 --volumes-from dc01 centos:7
[root@docker02 ~]# docker run -it --name dc04 --volumes-from dc03 centos:7
在dc01写入测试文件
[root@docker02 ~]# docker attach dc01
[root@c51193b259a6 ~]# cd /datavolumeContainer01/
[root@c51193b259a6 datavolumeContainer01]# echo '123.com' > test.txt
在dc03,dc04查看
[root@docker02 ~]# docker attach dc04
[root@99e827c0e722 datavolumeContainer01]# cd /datavolumeContainer01/
[root@99e827c0e722 datavolumeContainer01]# ls
test.txt
[root@99e827c0e722 datavolumeContainer01]# touch update.txt
在宿主机查看
[root@docker02 mydatavolume]# ls
test.txt update.txt