文章目录
- 一.Docker介绍
- 1.容器的介绍及作用
- 1.1 docker的提出
- 1.2 dockers的简介
- 1.3什么是容器
- 1.4容器和虚拟机的区别
- 二.Docker的安装部署
- 1.docker的安装
- 2.Docker体系结构
- 3.docker镜像主要命令
- 3.1 获取镜像
- 3.2 镜像基本查看
- 3.3镜像详细信息查看
- 3.4只查看镜像ID
- 3.5镜像的导入和导出
- 3.6镜像的删除
- 三.容器的管理
- 1.运行第一个容器
- 1.1 交互式的容器
- 1.2 守护式容器
- 1.3 容器的类型
- 1.4 容器的启动\关闭\连接
- 2.docker端口映射
- 3.docker数据卷
- 四、制作本地局域网yum源
一.Docker介绍
1.容器的介绍及作用
1.1 docker的提出
1.容器技术最早出现在FreeBSD上叫做 jail,将一个进程放入jail中运行,不管这个进程在其中发生怎样的错误都不会影响到系统上其他进程的运行。后来,jail技术在Linux中的实现叫做vserver,vserver所实现的功能体现为chroot以及namespaces实现资源的隔离, 容器技术出现的主要目的是为了"资源隔离"
2.LXC,将原来需要手工编码实现的容器技术,进行了封装。实现了,更加方便、快速的容器创建及管理的技术。通过固有“模板”,安装并启动容器。将远程的程序包下载到本地,安装并创建好我们需要的容器。
确实,LXC已经很大程度上降低了容器管理的难度,但是依然使用一些弊端。有些时候可能需要自定制模板,以及使用LXC中自带的模板,以及大规模创建及复制依然比较麻烦。所以,很难大规模的应用。
3.所以,出现了Docker技术。Docker是在LXC基础上,使用GoLang二次开发的封装版。
1.2 dockers的简介
Docker 是 Docker.Inc 公司开源的一个基于 LXC技术之上构建的Container容器引擎, 源代码托管在 GitHub 上, 基于Go语言并遵从Apache2.0协议开源。
Docker是通过内核虚拟化技术(namespaces及cgroups等)来提供容器的资源隔离与安全保障等。由于Docker通过操作系统层的虚拟化实现隔离,所以Docker容器在运行时,不需要类似虚拟机(VM)额外的操作系统开销,提高资源利用率。
1.3什么是容器
容器是隔离的环境中运行的一个进程,如果进程结束,容器就会停止,容器的隔离环境,拥有自己的ip地址,系统文件,主机名,进程管理
程序: 代码,软件,命令
进程:正在运行的程序
1.4容器和虚拟机的区别
虚拟机: 硬件cpu支持(vt虚拟化),模拟计算硬件,走正常的开机启动
bios开机自检–根据bios启动项–读取硬盘第一个扇区grub,uefi, centos7, 加载内核,启动系统第一个进程/sbin/init systemd
容器: 不需要硬件cpu的支持,共用宿主机内核,启动容器的第一个进程
容器优势: 启动快,性能高,损耗少,轻量级
100虚拟机 100个服务 10宿主机
100容器 100个服务 6宿主机
二.Docker的安装部署
1.docker的安装
#安装docker-ce
wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
sed -i 's+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo
yum install docker-ce -y
systemctl enable docker
systemctl start docker
#验证
[root@docker01 yum.repos.d]# docker version
Client: Docker Engine - Community
Version: 19.03.5
API version: 1.40
Go version: go1.12.12
Git commit: 633a0ea
Built: Wed Nov 13 07:25:41 2019
OS/Arch: linux/amd64
Experimental: false
2.Docker体系结构
3.docker镜像主要命令
docker是一个cs架构, docker主要:镜像 容器 仓库 网络 存储 监控
docker是一个软件的打包技术.
docker run -d -p 80:80 nginx:latest
run 创建并启动一个容器
-d 放后台启动
-p 端口映射
nginx:latest docker镜像名称
docker search 搜索镜像, 优先选官方,stars数量多
docker pull 拉取镜像(下载镜像),注意版本
docker push 推送镜像(上传镜像)
docker image ls 查看镜像列表
docker load 导入镜像
例子: docker load -i docker_nginx.tar.gz
docker save 导出镜像
例子:docker save centos:7 -o docker_centos7.tar.gz
docker rmi 删除镜像
docker tag 给镜像打标签
3.1 获取镜像
镜像查询:
docker search centos
镜像下载:
docker pull centos:6.9
docker pull centos:7.5.1804
docker pull nginx
3.2 镜像基本查看
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 0901fa9da894 3 days ago 132MB
centos 6.9 2199b8eb8390 16 months ago 195MB
centos 7.5.1804 cf49811e3cdb 16 months ago 200MB
标识镜像唯一性的方法
1. REPOSITORY:TAG(REPOSITORY :镜像名,有2种,一种是官方的,一种是别人写好推上去github的 TAG:标识版本)
centos7.5.1804
2.IMAGE ID (SHA256:64位的号码,默认只截取12位)
3.3镜像详细信息查看
[root@docker /]# docker image inspect centos:6.9(REPOSITORY:TAG)
[root@docker /]# docker image inspect 2199b8eb8390(IMAGE ID)
3.4只查看镜像ID
[root@docker /]# docker image ls -q
3.5镜像的导入和导出
[root@docker ~]# docker image save 2199b8eb8390 >/tmp/centos.tar(导出)
[root@docker ~]# docker image rm 2199b8eb8390
[root@docker ~]# docker image load -i /tmp/centos.tar (导入)
[root@docker ~]# docker image tag 2199b8eb8390 lbz/centos:v1(打标签)
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 0901fa9da894 3 days ago 132MB
lbz/centos v1 2199b8eb8390 16 months ago 195MB
centos 7.5.1804 cf49811e3cdb 16 months ago 200MB
3.6镜像的删除
删除某个镜像
[root@docker ~]# docker image rm -f 2199b8eb8390
删除所有镜像
[root@docker ~]# docker image rm -f `docker image ls -q`
查看:
[root@docker ~]# docker images 为空
三.容器的管理
docker run 创建并启动容器
例子:docker run -d -it -p 80:80 nginx:latest
docker create 创建容器 --name
docker start 启动容器
docker stop 停止容器
docker restart 重启容器
docker kill 强制停止容器
docker ps 查看容器列表 -a 查看所有容器
docker rm 删除容器
批量删除所有容器 docker rm -f `docker ps -a -q`
docker exec 进入正在运行的容器(分配一个新终端)
例子: docker exec -it 容器id/容器名字 /bin/bash(/bin/sh)
docker attach 进入正在运行的容器(使用相同的终端),偷偷离开的快捷键ctrl +p,ctrl +q
容器想要在后台一直运行的话,那么容器的初始命令,必须夯住(前台运行),否则容器就会退出.
前台运行
nginx -g 'daemon off;'
/usr/sbin/php-fpm --nodaemonize
1.运行第一个容器
1.1 交互式的容器
[root@docker ~]# docker pull centos:6.9
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 6.9 2199b8eb8390 16 months ago 195MB
[root@docker ~]# docker container run -it 2199b8eb8390 (此数字为镜像名)(-i交互式启动 -t开一个终端) #进入一个容器并启动
[root@docker ~]# docker container run -it 2199b8eb8390
[root@451dc436f99a /]# #进入容器了
[root@docker ~]# docker container ls ---查看正在运行的容器信息
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
451dc436f99a 2199b8eb8390 "/bin/bash" 17 seconds ago Up 16 seconds lucid_herschel(容器启动的随机名字)
CONTAINER ID: 容器的唯一号码(自动生成的)
NAMES ID: 容器的名字(可以自动,也可以手工指定)
[root@docker ~]# docker container run -it --name='lbz_cent69'(手工指定的容器名字) 2199b8eb8390(镜像名)
[root@docker ~]# docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
00b8ece2aa21 2199b8eb8390 "/bin/bash" 24 seconds ago Up 23 seconds lbz_cent69
STATUS : 容器的运行状态 (Exited , Up)
[root@docker ~]#exit ---退出容器
[root@docker ~]# docker pull centos:6.9
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 6.9 2199b8eb8390 16 months ago 195MB
[root@docker ~]# docker container run -it 2199b8eb8390 (此数字为镜像名)(-i交互式启动 -t开一个终端) #进入一个容器并启动
[root@docker ~]# docker container run -it 2199b8eb8390
[root@451dc436f99a /]# #进入容器了
[root@docker ~]# docker container ls ---查看正在运行的容器信息
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
451dc436f99a 2199b8eb8390 "/bin/bash" 17 seconds ago Up 16 seconds lucid_herschel(容器启动的随机名字)
CONTAINER ID: 容器的唯一号码(自动生成的)
NAMES ID: 容器的名字(可以自动,也可以手工指定)
[root@docker ~]# docker container run -it --name='lbz_cent69'(手工指定的容器名字) 2199b8eb8390(镜像名)
[root@docker ~]# docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
00b8ece2aa21 2199b8eb8390 "/bin/bash" 24 seconds ago Up 23 seconds lbz_cent69
STATUS : 容器的运行状态 (Exited , Up)
[root@docker ~]#exit ---退出容器
1.2 守护式容器
[root@docker ~]# docker pull nginx
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 0901fa9da894 3 days ago 132MB
centos 6.9 2199b8eb8390 16 months ago 195MB
[root@docker ~]# docker run -d --name="lbz_nginx" nginx:latest (-d使容器一直
运行下去,不退出)查询容器的详细信息:
[root@docker ~]# docker container inspect lbz_nginx(可以查询到容器的ip地址)
访问:
[root@docker ~]#curl -I 172.17.0.2(docker容器的地址)
1.3 容器的类型
[root@docker ~]# docker pull centos:7.5.1804
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 0901fa9da894 3 days ago 132MB
centos 6.9 2199b8eb8390 16 months ago 195MB
centos 7.5.1804 cf49811e3cdb 16 months ago 200MB
交互式的容器: 工具类: 开发,测试,临时性的任务()
[root@docker ~]# docker container run -it --name="lbz_cent75" --rm cf49811e3cdb(当容器退出时会自动被删除掉)
守护式容器: 网络服务
[root@docker ~]# docker container run -d -p 8080:80 --name="lbz_nginx_80" nginx:latest (-p提供端口对外提供服务)
在物理机访问:10.0.0.200:8080(能够访问)相当于访问宿主机的8080端口就是访问docker的80端口
1.4 容器的启动\关闭\连接
守护式容器的关闭和启动
[root@docker ~]# docker container stop lbz_nginx_80(容器名)
[root@docker ~]# docker container start lbz_nginx_80
交互式的容器的关闭和启动
[root@docker ~]# docker container stop nervous_allen(容器名)
[root@docker ~]# docker container start -i nervous_allen(-i为交互形式)
容器的连接方法:(登陆到已存在的容器当中,不会生成新的进程)偷偷离开的快捷键ctrl +p,ctrl +q
[root@docker ~]# docker container attach nervous_allen
子进程的方式登录(在已有工作容器中生成子进程,做登录,可以进行容器的调试,出退时也不会影响到当前容器)
[root@docker ~]# docker container exec -it nervous_allen /bin/bash
总结:
让容器永生的方法:(即不手动关闭容器就不会宕掉)
1. 进入容器后按ctrl + P, Q,可以使容器一直运行,而不会中断,不然的话退出容器就会断了,
应用时再用attach 调用到前台
3. 起容器时用死循环 sleep+时间
4. 让程序前台一直运行(夯在前台) -d 制作守护式容器时,常用的方法
2.docker端口映射
端口映射的使用场景:
容器启动快,资源占用小,
虚拟机:有自己的内核,模拟硬件,走正常的开机启动流程
容器:共用宿主机的内核,
docker run
-p 宿主机端口:容器端口
-p 宿主机ip1:宿主机端口:容器端口 (多个容器同时使用80端口)
-p 宿主机ip1::容器端口 随机端口映射
-p 宿主机ip1::容器端口/udp 使用udp协议做随机端口映射
-p 80:80 -p 3306:3306
-p 1111-1119:1111-1119 端口范围映射
-P(大写) 自动随机端口映射
3.docker数据卷
docker run
-v 宿主机绝对目录:容器目录
-v 容器目录 #创建一个随机卷,来持久化容器的目录下的数据
-v 卷名:容器目录 #创建一个固定名字的卷,来持久化容器的目录下的数据
–volumes-from 跟某一个容器挂载所有相同的卷
(1) 宿主机模拟数据目录
mkdir -p /opt/Volume/a
mkdir -p /opt/Volume/b
touch /opt/Volume/a/a.txt
touch /opt/Volume/b/b.txt
(2) 启动数据卷容器
docker run -it --name "nginx_volumes" -v /opt/Volume/a:/opt/a -v /opt/Volume/b:/opt/b centos:6.9 /bin/bash
ctrl p q
(3) 使用数据卷容器
docker run -d -p 8085:80 --volumes-from nginx_volumes --name "n8085" nginx
docker run -d -p 8086:80 --volumes-from nginx_volumes --name "n8086" nginx
验证:
[root@docker ~]# docker container exec -it n8085 /bin/bash
root@f9c8b5d85e68:/# cd /opt/
root@f9c8b5d85e68:/opt# ls
a b
root@f9c8b5d85e68:/opt# cd a
root@f9c8b5d85e68:/opt/a# ls
a. txt
[root@docker html]# cd /opt
[root@docker opt]# cd Volume/
[root@docker Volume]# ll
total 0
drwxr--r-- 2 root root 19 May 1 15:49 a
drwxr--r-- 2 root root 19 May 1 15:49 b
[root@docker Volume]# cd a/
[root@docker a]# ls
a. txt
修改宿主机
[root@docker a]# vim a.txt
a
查看docker
root@f9c8b5d85e68:/opt/a# cat a.txt
a
作用: 在集中管理集群中,大批量的容器都需要挂载相同的多个数据卷时,可以采用数据卷容器进行统一管理
四、制作本地局域网yum源
1.配置
1. 安装vsftpd软件
[root@docker ~]# yum install -y vsftpd
2. 启动ftp
[root@docker ~]# systemctl enable vsftpd
[root@docker ~]# systemctl start vsftpd
3. 上传系统镜像到虚拟机
[root@docker ~]# cd /mnt
上传centos7.5和6.9的镜像
[root@docker mnt]# rz –E
4. 配置yum仓库
mkdir -p /var/ftp/centos6.9
mkdir -p /var/ftp/centos7.5
[root@docker ~]# mount -o loop /mnt/CentOS-6.9-x86_64-DVD-1804.iso /var/ftp/centos6.9/
[root@docker centos6.9]# mount -o loop /mnt/CentOS-7-x86_64-DVD-1804.iso /var/ftp/centos7.5/
mount: /dev/loop0 is write-protected, mounting read-only
验证:
cat >/etc/yum.repos.d/ftp_6.repo <<EOF
[ftp]
name=ftpbase
baseurl=ftp://10.0.0.200/centos6.9
enabled=1
gpgcheck=0
EOF
[root@docker yum.repos.d]# yum clean all
[root@docker yum.repos.d]# yum makecache
cat >/etc/yum.repos.d/ftp_7.repo <<EOF
[ftp]
name=ftpbase
baseurl=ftp://10.0.0.200/centos7.5
enabled=1
gpgcheck=0
EOF
2.访问
ftp://10.0.0.200