Docker容器介绍与安装-Day 01
1. 什么是容器?
容器就是在隔离的环境运行的一个进程,如果进程停止,容器就会销毁。
隔离环境下运行的容器拥有自己的系统文件(好比/目录下面的文件),ip地址,主机名等(就好比虚拟化了一个新的操作系统)。如下图:
2. Docker容器和KVM虚拟化的区别
容器:共用宿主机内核,容器的第一个进程直接运行需要运行的服务,轻量级,损耗少,启动快,性能高,但是只能运行linux操作系统。
虚拟机:需要硬件支持,需要模拟硬件,需要走开机启动流程,可以运行不同的操作系统。
3. 容器技术的发展过程
(1)chroot技术,新建一个子系统(拥有自己完整的系统文件)
参考资料:https://www.ibm.com/developerworks/cn/linux/l-cn-chroot/
(2)linux容器(lxc) linux container(namespaces 命名空间 隔离环境 及cgroups 资源限制)
cgroups 限制一个进程能够使用的资源。cpu,内存,硬盘io
kvm虚拟机:资源限制(1c 1G 20G)
(3)docker容器
4. Docker容器介绍
Docker是通过进程虚拟化技术(namespaces及cgroups cpu、内存、磁盘io等)来提供容器的资源隔离与安全保障等。每一个容器,他都有自己的系统文件rootfs.
由于Docker通过操作系统层的虚拟化实现隔离,所以Docker容器在运行时,不需要类似虚拟机(VM)额外的操作系统开销,提高资源利用率。
namespace 资源隔离
cgroups 进程的资源限制
kvm 虚拟磁盘文件,资源隔离
kvm 资源限制,--cpus --memory
docker是一种软件的打包技术
构建:做一个docker镜像
运输:docker pull
运行:启动一个容器
kvm解决了硬件和操作系统之间的依赖
kvm独立的虚拟磁盘,xml配置文件
docker解决了软件和操作系统环境之间的依赖,能够让独立服务或应用程序在不同的环境中,得到相同的运行结果。
docker镜像有自己的文件系统。
docker容器是一种轻量级、可移植、自包含的软件打包技术,使应用程序可以在几乎任何地方以相同的方式运行。开发人员在自己笔记本上创建并测试好的容器,无需任何修改就能够在生产系统的虚拟机、物理服务器或公有云主机上运行。
5. docker的安装
5.1 配置要求
操作系统 | 内存要求 | IP地址 | 主机名 |
---|---|---|---|
CentOS7.6 | 2G | 10.0.0.11 | docker01 |
CentOS7.6 | 2G | 10.0.0.12 | docker02 |
5.2 安装步骤
两台机器安装方式相同
cat >> /etc/hosts << EOF
10.0.0.11 docker01
10.0.0.12 docker02
EOF
rm -fr /etc/yum.repos.d/local.repo
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
sed -i 's#download.docker.com#mirrors.tuna.tsinghua.edu.cn/docker-ce#g' /etc/yum.repos.d/docker-ce.repo
yum install docker-ce -y
systemctl enable docker
systemctl start docker
6. docker的主要组成部分
docker是传统的CS架构,分为docker client和docker server,像mysql一样
docker主要组件有:镜像、容器、仓库, 网络,存储
启动容器必须需要一个镜像,仓库中只存储镜像
容器---镜像---仓库
查看docker版本:docker version
[root@controller ~]# docker version
Client: # 客户端版本信息
Version: 17.12.0-ce # 客户端docker版本
API version: 1.35 # api版本
Go version: go1.9.2 # go语言版本(docker是go语言开发的)
Git commit: c97c6d6 # git提交的id
Built: Wed Dec 27 20:10:14 2017 # 版本更新时间
OS/Arch: linux/amd64 #
Server: # docker服务端
Engine: # docker引擎
Version: 17.12.0-ce
API version: 1.35 (minimum version 1.12)
Go version: go1.9.2
Git commit: c97c6d6
Built: Wed Dec 27 20:12:46 2017
OS/Arch: linux/amd64
Experimental: false
查看docker详细信息docker info(可以用来做监控)
[root@docker01 ~]# docker info
Containers: 0 # 容器数量
Running: 0 # 运行中的容器
Paused: 0 # 暂停的容器
Stopped: 0 # 停止的容器
Images: 0 # 镜像数量
Server Version: 18.09.8 # 版本
Storage Driver: overlay2
Backing Filesystem: xfs # 文件系统
Supports d_type: true
Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge host macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 894b81a4b802e4eb2a91d1ce216b8817763c29fb
runc version: 425e105d5a03fabd737a126ad93d62a9eeede87f
init version: fec3683
Security Options:
seccomp
Profile: default
Kernel Version: 3.10.0-957.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 4
Total Memory: 1.934GiB
Name: docker01
ID: 2ZVM:MUC6:AIKD:S4LY:47LB:QY6Y:4MF3:4U6N:VDNG:LTFU:RGGI:VCXC
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
Product License: Community Engine
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled
6. 启动第一个容器
# 配置docker镜像加速,国内源(镜像默认从国外下载)
[root@docker01 ~]# vi /etc/docker/daemon.json #该文件默认不存在,需要手动创建
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
[root@docker01 ~]# systemctl restart docker
[root@docker01 ~]# docker run -d -p 80:80 nginx # 这里要注意,最后一列,一定是容器执行的命令(不需要执行命令的最后一列是镜像名称),倒数第二列一定是容器的镜像,注意启动容器时参数位置不能乱
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
f5d23c7fed46: Pull complete
918b255d86e5: Pull complete
8c0120a6f561: Pull complete
Digest: sha256:eb3320e2f9ca409b7c0aa71aea3cf7ce7d018f03a372564dbdb023646958770b
Status: Downloaded newer image for nginx:latest
df186433980cb46d0e01c6a1fe8ca9cb147f43c5d4fe651fec6b9a7cd52c4938
# run(创建并运行一个容器)
# -d 放在后台
# -p 端口映射
# nginx docker镜像的名字
访问10.0.0.11
[root@docker01 ~]# curl -I 10.0.0.11
HTTP/1.1 200 OK
Server: nginx/1.17.2
Date: Sun, 28 Jul 2019 02:56:55 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 23 Jul 2019 11:45:37 GMT
Connection: keep-alive
ETag: "5d36f361-264"
Accept-Ranges: bytes
7. docker的镜像管理
7.1 搜索镜像
docker search 镜像名
# 选镜像的建议:
1,优先考虑官方(OFFICIAL)
2,stars数量多的(STARS)
3. 也可以通过浏览器到官方下载,hub.docker.com
[root@docker01 ~]# docker search CentOS-7
NAME # 镜像名称 DESCRIPTION # 描述 STARS #点赞的次数 OFFICIAL # 官方的 AUTOMATED # 通过工具,自动构建的镜像
saltstack/centos-7-minimal Centos 7 Minimal 11 [OK]
maaydin/centos-7-zookeeper Apache Zookeeper Docker Image based on CentO… 1
smarshalansherman/centos-7-maven centos-7-maven 1 [OK]
pacur/centos-7 Pacur CentOS 7 1 [OK]
dokken/centos-7 For use with kitchen-dokken, Base image plus… 0
fnbin/centos-7 0
fnbin/centos-7-zmq 0
pythonpillow/centos-7-amd64 0
d33tah/centos-7-with-ssh-and-docker 0
diodonfrost/centos-7-ansible Provides docker containers use for testing a… 0 [OK]
opencpu/centos-7 OpenCPU Server 2.0 builds for CentOS 7 0 [OK]
vadv/centos-7-pg96-python35 0
fnbin/centos-7-czmq 0
ivancalifornias/centos-7-node-npm 0
ezamriy/centos-7-vagrant-supervisor-ssh CentOS 7 vagrant friendly container with sup… 0 [OK]
jeqo/centos-7 0
rubydistros/centos-7 Ruby on CentOS 7 0
contrast/centos-7-golang 0
ivancalifornias/centos-7-robot-framework 0
william9527/centos-7-dev 0
ivancalifornias/centos-7-golang A container of my setup to build and package… 0
ceejatec/centos-70-couchbase-build 0
jqka/centos-7.3.1611 Centos-7.3.1611 0 [OK]
dfvinogradoff/centos-7-build 0
galateanl/centos-7-docker for deployment with centos 7, php 7.2, yarn … 0 [OK]
docker官网搜索镜像
7.2 获取镜像
docker pull 镜像名称 # 下载镜像
docker push 镜像名称 # 上传镜像
# 由于默认下载镜像特别慢,所以需要配置镜像加速,
# 镜像加速器:阿里云加速器,daocloud加速器,中科大加速器,Docker 中国官方镜像加速:https://registry.docker-cn.com(推荐使用该地址,比较稳定,其他地址有时候更新后,可能无法使用)
# 官方pull docker pull centos:6.8(没有指定版本,默认会下载最新版)
# 私有仓库pull docker pull daocloud.io/huangzhichong/alpine-cn:latest
7.3 配置docker镜像加速
vi /etc/docker/daemon.json # 该文件默认不存在,需要手动创建
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
7.4 查看镜像列表
docker images
docker image ls
7.5 删除镜像
docker rmi 镜像名或镜像ID:版本
例子:
docker rmi centos:latest
docker image rm centos:latest
# 注意:如果被删除的镜像正在被容器使用,是无法删除的。
7.6 导出镜像
docker save 镜像名:版本
例子:
docker save centos > docker-centos7.4.tar.gz
docker image save -o /opt/docker.tar.gz 镜像:版本
7.7 导入镜像
docker load 镜像包
例子:
docker load -i docker-centos7.4.tar.gz
docker image load -i docker-centos7.4.tar.gz
8. docker的容器管理
docker run -d -p 80:80 nginx:latest
# 参数介绍:
run(创建并运行一个容器)
-d 放在后台
-p 端口映射
-v 源地址(宿主机):目标地址(容器)
nginx docker镜像的名字
# 进入容器
docker run -it --name centos6 centos:6.9 /bin/bash
# 参数介绍:
-it 分配交互式的终端,i交互式,t终端
--name 指定容器的名字
/bin/sh覆盖容器的初始命令
8.1 创建并启动容器
docker run image_name
docker run -it image_name CMD # 创建并运行容器后,再进入容器
docker run --name 容器启动后的名称 -d 镜像名
docker run ==== docker create + docker start
8.2 启动容器
docker start 容器名
8.3 停止容器
docker stop CONTAINER_ID
8.4 杀死容器
docker kill container_name
8.5 查看容器列表
docker ps # 查看正在运行的容器
docker ps –a # 查看所有容器,包括停止运行的
docker ps -l # 查看最近一个启动的容器
docker ps --no-trunc # 显示完整的容器信息
# [root@docker01 ~]# docker ps
CONTAINER ID (容器ID) IMAGE (使用的镜像) COMMAND (执行的命令) CREATED (创建时间) STATUS (当前状态) PORTS (端口映射情况 ) NAMES (容器名称)
8.6 进入容器(目的,调试,排错)
docker exec (会分配一个新的终端tty)
docker exec -it 容器id或容器名字 /bin/bash(/bin/sh)
docker attach(使用同一个终端)
docker attach [OPTIONS] CONTAINER
8.7 删除容器
docker rm # 删除已经停止的容器
docker rm -f # 删除正在运行的容器
8.8 强制删除所有容器
docker rm -f `docker ps -a -q`
# -f 强制删除
# -a 所有容器
# -q 只显示容器ID
8.9 容器与宿主机之间的文件传输
docker cp 宿主机目录,文件位置 容器ID:容器目录,文件位置
docker 容器ID:容器目录,文件位置 cp 宿主机目录,文件位置
#例子:docker cp ./ 66aee4681ad9:/etc/hosts # 把容器的/etc/hosts文件,复制到宿主机的当前目录
8.10 总结
docker容器内的第一个进程(初始命令)必须一直处于前台运行的状态(必须夯住),否则这个容器,就会处于退出状态!
业务在容器中运行:夯住,启动服务
9. docker容器的网络访问(端口映射)
指定映射(docker 会自动添加一条iptables规则来实现端口映射)
-p hostPort:containerPort
-p ip:hostPort:containerPort 多个容器都想使用80端口
-p ip::containerPort(随机端口)
-p hostPort:containerPort:udp
-p 10.0.0.100::53:udp
-p 81:80 –p 443:443 可以指定多个-p
随机映射
docker run -P (随机端口)
通过iptables来实现的端口映射
10. docker的数据卷管理
-v 宿主机目录:容器目录
如果数据库的挂载点下有数据,会直接挂载到容器中,覆盖原有的数据,如果没有,则容器中的数据库,会复制到这个挂载点
10.1 练习案例:通过配置数据卷在NGINX站点目录下添加像素小鸟。
资源包下载地址:
链接:https://pan.baidu.com/s/1i9q5uk_GMmjJ8FDLs3sq7A
提取码:o3y1
(1)解压像素小鸟资源包
[root@docker01 /srv]# unzip xiaoniaofeifei.zip
[root@docker01 /srv]# ls
2000.png 21.js icon.png img index.html sound1.mp3 xiaoniaofeifei.zip
(2)创建容器与数据卷
[root@docker01 /srv]# docker run -d -p 81:80 -v /srv:/usr/share/nginx/html nginx:latest
7ad034e16cb97c2a828cebafda6878c2de9ae86d752a5f3536fd10746779a781
(3)查看容器运行状态
[root@docker01 /srv]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7ad034e16cb9 nginx:latest "nginx -g 'daemon of…" 3 minutes ago Up 3 minutes 0.0.0.0:81->80/tcp suspicious_goldwasser
(4)浏览器访问
10.2 总结:使用数据卷的好处
当我们的网站遇到bug的时候,直接修改宿主机目录下的web网站相关文件就可以了,而不用登录到容器中进行修改。
例如:在宿主机目录,修改像素小鸟网站标题
[root@docker01 /srv]# cat index.html|head -7
<!DOCTYPE HTML>
………………省略若干行
<title>小鸟飞飞飞-文章库小游戏</title>
………………省略若干行
修改后
[root@docker01 /srv]# cat index.html|head -7
<!DOCTYPE HTML>
………………省略若干行
<title>小鸟飞飞飞-修改测试</title>
………………省略若干行
浏览器访问
10.3 指定卷的方式
创建一个基于数据卷的容器
[root@docker01 /srv]# docker run -d -p 82:80 -v test:/usr/share/nginx/html nginx:latest
ad07534ee9f37bd481d13c7115082aed055d5a9614c73398a40a6b8e6f190be5
查看数据卷生成情况
[root@docker01 /srv]# docker volume ls
DRIVER VOLUME NAME
local test
查看数据卷详细
[root@docker01 /srv]# docker volume inspect test
[
{
"CreatedAt": "2019-07-28T12:12:16+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/test/_data",
"Name": "test",
"Options": null,
"Scope": "local"
}
]
[root@docker01 /srv]# cd /var/lib/docker/volumes/test/_data
[root@docker01 /var/lib/docker/volumes/test/_data]# ls
50x.html index.html
10.4 查找随机卷
# 如何知道一个容器对应的数据卷名是什么
## 查看数据卷的名字
docker inspect --type container --format='{{range .Mounts}}{{.Name}}{{end}}' container1
## 查看数据卷的具体信息
docker inspect --type container 容器名
10.5 数据卷总结
持久化
数据卷(文件或目录)
-v 卷名:/data(卷不存在,自动创建,如果卷中有东西,就直接把该卷挂载到容器指定目录下。如果卷中没有东西,就会把容器目录下的东西挂载到宿主机数据卷所在的目录下)
-v src(宿主机的目录):dst(容器的目录)
数据卷容器
--volumes-from(跟某一个已经存在的容器挂载相同的卷)
10.6 练习:基于nginx多端口的多站点。
# 配置要求
基于nginx启动一个容器,监听80和81,访问80,出现nginx默认欢迎首页,访问81,出现小鸟。
-p 80:80 -p 81:81 -v xxx:xxx -v xxx:xxxx
(1)清除所有容器
root@docker01 ~]# docker rm -f `docker ps -a -q`
ad07534ee9f3
7ad034e16cb9
(2)生成81端口的配置文件
[root@docker01 /tmp]# vim xiaoniao.conf
server {
listen 81;
server_name localhost;
root /tmp;
index index.html index.htm;
location / {
}
}
(3)启动容器
[root@docker01 /tmp]# docker run -d -p 80:80 -p 81:81 -v /tmp/xiaoniao.conf:/etc/nginx/conf.d/xiaoniao.conf -v /srv:/tmp nginx:latest
5ebcbadb1f1bb5463225db302b7ecb590d5d47b6b92029ceceebee8e09be0319
(4)浏览器访问
11. 为什么容器起来了,马上就退出了?
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
66aee4681ad9 nginx "/docker-entrypoint.…" 23 minutes ago Up 22 minutes 0.0.0.0:80->80/tcp nice_jones
# 如上面这个nginx容器,看“COMMAND”这里,就是这个命令让nginx运行在后台的
[root@docker01 ~]# docker run -d centos # 又如这个centos容器,启动的时候没有指定使用的命令,ps查看默认的COMMAND为/bin/bash,这个命令是无法让centos这个容器夯主的。
f54c64a994de21bf31058324ef6c1d46d0a5d400a2f2234b1f76a615bab39d14
[root@docker01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f54c64a994de centos "/bin/bash" 5 seconds ago Exited (0) 4 seconds ago musing_benz
66aee4681ad9 nginx "/docker-entrypoint.…" 26 minutes ago Up 25 minutes 0.0.0.0:80->80/tcp nice_jones
# 这里换一种方式启动
[root@docker01 ~]# docker run -d centos tail -f /etc/hosts # 指定容器执行的命令为tail -f /etc/hosts,这样容器就会在前台 运行,不会退出
f67ff71336027de1ad316315a8ad035851accf90725d79f356fc16ae765b1c3a
[root@docker01 ~]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f67ff7133602 centos "tail -f /etc/hosts" 7 seconds ago Up 6 seconds magical_bhaskara