docker(一)
什么是容器
容器就是在隔离的环境里面执行的命令产生的一个进程, 如果进程停止, 容器就会销毁。
容器运行的隔离环境有系统文件,ip地址, 主机名等。
容器和虚拟化的区别
kvm虚拟化
需要硬件的支持, 需要模拟硬件(CPU, 网卡, 内存等), 可以运行不同的操作系统, 启动时间分钟级(走开机启动流程)
linux开机启动流程
- bios开机自检
- 根据bios设置的启动项(光盘,本地硬盘)来启动设备
- 读取启动设备的引导分区(mbr), 根据引导分区的配置路径启动内核
- 加载内核
- 启动第一个进程 (centos6:
/sbin/init
, centos7:/usr/lib/systemd/systemd
)
容器虚拟化
不需要硬件的支持, 不需要模拟硬件, 共用宿主机的内核, 启动时间秒级(直接就跳到开机启动流程的加载内核开始-启动第一个进程)
容器相对于kvm的优势
- 容器启动速度快
- 性能高
- 资源消耗少
容器的弱点
- 只能使用linux的系统
使用chroot监狱限制ssh用户访问制定目录和使用制定命令
https://linux.cn/article-8313-1.html
docker容器
docker是通过内核虚拟化技术(namespace和cgroups)
namespace: 提供隔离环境(独立的系统文件, ip地址, 主机名)
cgroups: 限制进程资源的使用(多少内存, 多少CPU, 硬盘的读写)
docker的主要目标是构建,传输, 处处运行
所以 docker又叫是一种软件的打包技术
-
构建
做一个docker镜像
-
运输
docker pull
-
运行
启动一个容器
每一个容器都有自己的系统文件 rootfs
docker安装
https://mirror.tuna.tsinghua.edu.cn/help/docker-ce/
- 更换成阿里云的基础yum仓库
https://developer.aliyun.com/mirror
$ mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
$ wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
- 下载docker源
$ wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
- 把软件仓库地址替换为 TUNA
$ sudo sed -i 's+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo
- 安装
$ yum makecache fast
$ yum install docker-ce
- 启动服务
$ systemctl start docker
$ systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to
docker组件
docker主要组件有: 镜像, 容器, 仓库
镜像是一个模板, 容器就是基于模板做的链接克隆, 仓库中存储镜像
容器----镜像----仓库
docker安装nginx
- 配置docker镜像加速
$ vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
$ systemctl restart docker
- 安装nginx
$ docker run -d -p 80:80 nginx
- 启动nginx
$ docker run -d -p 80:80 nginx
c1c07622a1956eb52a6c59b4756baf928def2c84afb44f19ab810ab3f1d9adfe
docker的镜像管理
search 搜索镜像
pull 下载镜像
list 查看镜像列表
save 导出镜像
load 导入镜像
rmi 删除镜像
inspect 查看镜像属性
搜索镜像
docker search <镜像名>
$ docker search zabbix
获得镜像
docker pull (push)
镜像加速器: 阿里云加速器, daocloud加速器, 中科大加速器, docker中国官方加速器(https://registry.docker-cn.com)
- 获取默认仓库镜像
$ docker pull centos:6.8
$ docker login daocloud.io
$ docker pull daocloud.io/library/tomcat:8.0.45-jre7
查看镜像
$ docker image ls
$ docker images
删除镜像
$ docker image rm centos:6.8
$ docker rmi alpine:latest
导出镜像
$ docker save nginx:latest > docker_nginx.tar.gz
导入镜像
$ docker image load -i docker_nginx.tar.gz
docker容器管理
run 创建并启动一个容器
stop 停止容器
kill 杀死容器
ps 查看容器列表
start 启动容器
rm 删除容器
exec 进入容器
inspect 查看容器属性
创建并运行一个容器
$ docker run -d -p 80:80 nginx
参数解释
run 创建并运行一个容器
-d 放在后台
-p 端口映射
nginx docker镜像的名字
创建并运行一个容器并分配一个可交互式的终端
$ docker run -it --name centos6 centos:6.9 /bin/bash
参数解释
-it 分配交互式终端
--name 指定容器的名字
/bin/bash 覆盖容器的初始命令
容器的启动和停止
- 查看正在运行的容器
$ docker ps
- 查看所有容器
$ docker ps -a
- 停止容器
$ docker stop zen_poincare
- 杀死容器
$ docker kill zen_poincare
- 启动容器
$ docker start zen_poincare
删除容器
$ docker rm romantic_hertz
$ docker rm 56be582f3d06
批量删除容器
$ docker ps -a -q
e65225739c98
806e34c28fd1
47e837a4d0c5
cf41a5216d0f
69a6bcef55f2
2dc5e5fcacb7
c1c07622a195
b3d165f8fabb
49dc5c719043
$ docker rm `docker ps -a -q`
进入容器
- docker attach <容器id>
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3e1ed93fe4fd centos:6.9 "/bin/bash" 10 seconds ago Up 10 seconds pedantic_banzai
$ docker attach 3e1ed93fe4fd
[root@3e1ed93fe4fd /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 11:51 pts/0 00:00:00 /bin/bash
root 13 1 0 11:52 pts/0 00:00:00 ps -ef
ctrl+p, 松手, ctrl+q, 暂时退出容器, 容器不会停止, 只是退出当前终端, 如果使用ctrl+d退出容器, 则容器就会停止
- docker exec -it <容器id> <初始命令>
$ docker exec -it 3e1ed93fe4fd /bin/bash
$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 11:51 pts/0 00:00:00 /bin/bash
root 15 0 0 11:58 pts/1 00:00:00 /bin/bash
root 26 15 0 11:58 pts/1 00:00:00 ps -ef
这个方法使用ctrl+d退出容器, 则容器不会停止
注意
docker容器内的第一个进程必须一致处于前台运行的状态(必须夯住), 否则这个容器, 就会处于退出状态
错误例子
$ docker run -d centos:6.9 /bin/bash
$ docker run centos:6.9 /bin/bash
$ docker run -it centos:6.9 sleep 20
$ docker run -it centos:6.9 pwd
查看容器是否运行
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
21bc7b582e7f centos:6.9 "/bin/bash" 12 seconds ago Exited (0) 12 seconds ago sharp_allen
bcb9e2683fce centos:6.9 "/bin/bash" 30 seconds ago Exited (0) 30 seconds ago festive_maxwell
b26595453064 centos:6.9 "sleep 20" 14 minutes ago Exited (0) 14 minutes ago intelligent_swirles
36af735df051 centos:6.9 "pwd" 14 minutes ago Exited (0) 14 minutes ago suspicious_robinson
docker的数据卷管理
上传自己的代码到容器的nginx的目录
$ mkdir -p /opt/nginx/
$ cat >> /opt/nginx/index.html<<EOF
> test
> EOF
$ docker rm -f `docker ps -a -q`
- docker run -d -p 80:80 -v src(宿主机目录):dst(容器的目录) nginx:latest
$ docker run -d -p 80:80 -v /opt/nginx:/usr/share/nginx/html nginx:latest
如果要修改网络内容, 在宿主机上改就行了
- docker run -d -p 81:80 --volumes-from <容器名> nginx:latest
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
572504d4ca37 nginx:latest "nginx -g 'daemon of…" 11 minutes ago Up 11 minutes 0.0.0.0:80->80/tcp blissful_mendeleev
$ docker run -d -p 81:80 --volumes-from blissful_mendeleev nginx:latest
60e457b7c1d7d06b060211454bbe67d7e619e6ef69b46248b3cae3e20b7a3a1e
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
60e457b7c1d7 nginx:latest "nginx -g 'daemon of…" 6 seconds ago Up 5 seconds 0.0.0.0:81->80/tcp quirky_curie
572504d4ca37 nginx:latest "nginx -g 'daemon of…" 15 minutes ago Up 15 minutes 0.0.0.0:80->80/tcp blissful_mendeleev
基于nginx启动一个容器, 监听80和81, 访问80, 出现nginx默认的欢迎首页, 访问81, 出现test
- 宿主机上准备配置文件
$ cat >> /opt/nginx/index.html<<EOF
> test
> EOF
$ cat >> /opt/nginx.conf<<EOF
> server {
> listen 81;
> server_name localhost;
>
> location / {
> root /opt/nginx;
> index index.html index.htm;
> }
> }
> EOF
- 删除镜像并创建新镜像
$ docker rm -f `docker ps -a -q`
- 启动新容器
$ docker run -d -p 80:80 -p 81:81 -v /opt/nginx.conf:/etc/nginx/conf.d/nginx.conf -v /opt/nginx:/opt/nginx nginx:latest