一、Docker概述
1.1 Docker是什么?
- 是一种轻量级的“虚拟机”
- 是linux容器里运行应用的开源工具
- Docker是基于Go语言实现的云开源项目
- Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次封装,到处运行”。
1.2 Docker和虚拟机的区别
docker安全不如虚拟机,因为docker会和宿主机共享内核资源
cgroup 做docker安全 资源分配,资源逻辑隔离
区别 | docker | 虚拟机 |
---|---|---|
所需资源 | 少 | 多 |
启动时间 | 短(十几毫秒) | 长(几分钟) |
安全 | 共享内核,不安全 | 系统逻辑隔离,安全 |
服务 | 一个容器只跑一个服务 | 可以运行多个 |
1.3 Docker的使用场景
- 打包应用程序简化部署
- 可脱离底层硬件任意迁移
1.4 Docker的好处
●简化配置
Docker能实现从源代码到配置都打包成一个容器,所以简化了很多配置
●整合服务器
●代码流水线管理
●调试能力
●提高开发效率
配置简化当然就提高了开发效率。Docker还有一个特点就是可以做到测试环境,准生产环境和线上环境几乎保持一样的环境和配置。这个极大减少了开发调试错误和解决问题的效率
●多租户
●隔离应用
多个应用可以放在不同的容器中隔离开来,每一个容器互不干扰其他容器内部的应用
●快速部署
原来的运维人员需要配置很多在线上环境,现在部署软件,就是把所有数据打包成容器,把容器下载启动和简单配置就可以快速完成部署
Docker的核心概念及
1.5 Docker的架构
-
Docker使用客户端-服务器架构。Docker 客户端与Docker 守护进程进行对话,该守护进程完成了构建,运行和分发Docker容器的繁重工作。
-
Docker区别于传统的虚拟化,不需要虚拟硬件资源,直接使用容器引擎,所以速度快
-
Docker Client:客户端
-
Docker客户端(docker)是许多Docker用户与Docker交互的主要方式。当您使用诸如之类的命令时docker run,客户端会将这些命令发送到dockerd,以执行这些命令。该docker命令使用Docker API。Docker客户端可以与多个守护程序通信。
-
Docker daemon:守护进程
-
Docker守护程序(dockerd)侦听Docker API请求并管理Docker对象,例如图像,容器,网络和卷。守护程序还可以与其他守护程序通信以管理Docker服务。
-
Docker images:镜像
-
容器可以被打包成镜像
Docker container:容器 -
Docker registry:镜像仓库
存储镜像的地方,默认在公共的Docker Hub上查找,可以搞个人仓库
二、Docker的安装与优化
2.1 安装依赖包及环境
[root@localhost ~]# yum -y install yum-utils device-mapper-persistent-data lvm2
## yum-utils 提供了yum-config-manager
device-mapper-persistent-data ## device magger 存储驱动程序需要device-mapper-persistent-data和lvm2
## Device Mapper是 Linux2.6内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构
2.2 阿里云的镜像源设置
[root@localhost yum.repos.d]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo ## 设置阿里云镜像源
[root@localhost yum.repos.d]# ls
CentOS-Base.repo CentOS-CR.repo CentOS-Debuginfo.repo CentOS-fasttrack.repo CentOS-Media.repo CentOS-Sources.repo CentOS-Vault.repo docker-ce.repo
2.3 安装docker
[root@localhost yum.repos.d]# yum -y install docker-ce
[root@localhost yum.repos.d]# systemctl stop firewalld.service
[root@localhost yum.repos.d]# setenforce 0
[root@localhost yum.repos.d]# vim /etc/selinux/config
SELINUXTYPE=disabled
[root@localhost yum.repos.d]# systemctl start docker.service
[root@localhost yum.repos.d]# systemctl enable docker.service
2.4 镜像加速
- 每个人都有自己阿里云镜像加速地址
- 具体步骤为: 登录阿里云网关——搜索镜像加速————点击第一个官方镜像加速
————鼠标移到右下角,点击弹出的小窗选项容器镜像服务——————新窗口点击管理控制台————点击镜像镜像加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://pdvp1s0o.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
2.5 网络优化
[root@localhost yum.repos.d]# vim /etc/sysctl.conf
[root@localhost yum.repos.d]# sysctl -p
net.ipv4.ip_forward = 1
[root@localhost yum.repos.d]# systemctl restart network
[root@localhost yum.repos.d]# systemctl restart docker
三、Docker的基本命令
3.1 镜像的操作
- 搜索镜像
docker search nginx ## 搜索nginx镜像
- 下载镜像
docker pull nginx ## 下载nginx镜像 (stars–星级:代表着镜像的使用率)
- 查看镜像
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd centos 6d968a4bc824 6 hours ago 419MB
nginx latest 7e4d58f0e5f3 10 days ago 133MB
nginx web 7e4d58f0e5f3 10 days ago 133MB
centos 7 7e6257c9f8d8 5 weeks ago 203MB
paigeeworld/centos7 latest 4cbe7aa905e7 6 years ago 382MB
- 查看镜像详细信息
[root@localhost ~]# docker inspect 6d968a4bc824 ## 后面跟ID
- 为镜像添加标签
docker tag nginx:latest nginx:web ## 添加标签 并不是把原来的latest改掉了,而是以原来的基础上,添加了一个别名
- 删除镜像
docker rmi nginx:web ## 删除 标签 i是image 不加就是删容器 ## 后面的标签也可以改为ID,但是ID对应是只有一个标签,有别名 不可以直接删
- 导出镜像
[root@docker ~]# docker save -o /opt/nginx001 nginx:latest ## docker save -o 相应目录 仓库名:标签
[root@docker ~]# ls /opt
containerd nginx001
- 导入镜像
[root@docker ~]# docker load < /opt/nginx001 '//方法一'docker load < 镜像
Loaded image: nginx:latest
[root@docker ~]# docker load --input /opt/nginx001 '//方法二'docker load --input 镜像
Loaded image: nginx:latest
- 上传镜像
改标签
[root@localhost ~]# docker tag nginx:latest //wang/nginx:web ##//用户名/仓库名/镜像名
//登录
docker login
Username:docker
password:
Email:xxx@xxx.com
//上传镜像
docker push //wang/nginx:web
3.2 容器的基本操作
- 创建容器: docker create -it 仓库名:标签 登录环境
docker create -it nginx:latest /bin/bash ## -i 表示让容器的标准输入保持打开 -t 让Docker分配一个伪终端
- 查看容器列表
docker ps -a ## 容器列表 -a 列出所有容器,包括未运行的容器 不加-a 只列出up状态的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
275a7b973fae httpd:centos "/run.sh" 6 hours ago Exited (255) 8 minutes ago 0.0.0.0:8080->80/tcp recursing_darwin
9fb9c1835546 paigeeworld/centos7 "/bin/bash" 12 hours ago Exited (255) 8 minutes ago xenodochial_chandrasekhar
db5b95050922 nginx:latest "/docker-entrypoint.…" 12 hours ago Exited (0) 8 minutes ago 80/tcp quizzical_curran
- 启动容器
[root@localhost ~]# docker start 275a7b973fae
275a7b973fae
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
275a7b973fae httpd:centos "/run.sh" 6 hours ago Up 2 seconds 0.0.0.0:8080->80/tcp recursing_darwin
9fb9c1835546 paigeeworld/centos7 "/bin/bash" 12 hours ago Exited (255) 9 minutes ago xenodochial_chandrasekhar
db5b95050922 nginx:latest "/docker-entrypoint.…" 13 hours ago Exited (0) 9 minutes ago 80/tcp quizzical_curran
- 登陆正在运行的容器:两个方法
docker exec -it 容器id 环境
docker run -it 容器名:标签 环境
[root@docker ~]# docker exec -it 36c6af332247 /bin/bash
[root@36c6af332247 /]# ls '//可以输入命令'
anaconda-post.log bin dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
[root@36c6af332247 /]# exit '//退出'
exit
[root@docker ~]# docker ps -a '//刚刚的容器依旧是up状态'
- 停止容器
[root@localhost ~]# docker stop 275a7b973fae
275a7b973fae
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
275a7b973fae httpd:centos "/run.sh" 6 hours ago Exited (137) 4 seconds ago recursing_darwin
9fb9c1835546 paigeeworld/centos7 "/bin/bash" 12 hours ago Exited (255) 12 minutes ago xenodochial_chandrasekhar
db5b95050922 nginx:latest "/docker-entrypoint.…" 13 hours ago Exited (0) 12 minutes ago 80/tcp quizzical_curran
- 启动容器并执行命令(持续在后台运行)
[root@docker ~]# docker run -d centos:7 /bin/bash -c "while true;do echo hello;done" ## 后面写一个死循环
6101ea6eedbf7a1dcc75bb9d7cc1eb94e83b343b6829b6546d6ceda318545df6
'//-c:命令'
- 容器导出
docker export ID号 > nginx_c
- 容器导入
## 容器导入 (会生成镜像,而不会创建容器)
cat nginx_c | docker import - nginx:web
- 删除容器
docker rm ID
docker rmi id ## 删除镜像,正在被容器使用不可删,镜像在某个容器里,即使已经关闭容器,镜像也不能删
- 批量删除容器
docker ps -a | awk '{print "docker rm" $1 }' | bash ## up 状态的也不会删 ,只会删除关闭状态得容器 bash 用bash命令执行
- 启动执行命令查看系统根目录
docker pull paigeeworld/centos7 ## 下载centos 镜像
docker create -it paigeeworld/centos7 /bin/bash ## 在/bin/bash 环境下 创建包含centos7镜像的容器
docker start 9fb9c1835546f2fa4d2e88a77210d17104fc968245613885dffe2a5d16e77268 ## 运行容器
docker run paigeeworld/centos7 /usr/bin/bash -c ls / ## run命令 上面命令三合一
## 执行完成直接关闭 状态时Exited