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)浏览器访问
image.png
image.png

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
posted @ 2020-12-04 16:48  三花  阅读(537)  评论(0编辑  收藏  举报