初识docker

初识docker容器

docker是什么?

百度百科是这样跟我说的:Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口 。

相信刚接触docker的你,肯定是很懵逼;

在这里插入图片描述

那么,我们在来看下面这一段话,从docker的logo下手,

如果非要我用一句话描述这张图片,还在上幼儿园的我会说:“一条可爱的鲸鱼背着多个集装箱,畅游在大海里 ”!而现在我会说:“docker是一个运行在操作系统上的软件,这个软件上面可以运行多个相互隔离的容器”!不同的表述,同一个意思!这条可爱的鲸鱼就是咱们的docker而大海就是我们的操作系统,多个集装箱就是在docker上运行的容器!什么是容器咱们后面会说~~~

假如你想漂洋过海来看我,你可以选择自己造一条船,这样你就得自己备足很多干粮,还得准备很多一些其他的必需品才能出发!但是现在有一条鲸鱼游过来对你说,我这里有很多集装箱,里面有你所需要的一切,你选一个适合你的进来就可以了,我会带你乘风破浪的!

emmm,是不是一下子对觉得docker很容易理解了!

docker可以做什么?

  1. 使用docker可以巧妙的解决开发和运维之间的矛盾,不在至于代码在开发可以使用,一上线就不可用的情况,实现开发人员把代码的换环境打包,到哪里都可以运行的理念;
  2. 减少运维工作人员的压力,服务器环境弹性扩容时,在一台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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值