docker(一)
2020-01-07 本文已影响0人
吃可爱长大鸭
1.什么是容器?
容器就是在隔离的环境运行的一个进程,如果进程停止,容器就会销毁。隔离的环境拥有自己的系统文件,ip地址,主机名等
2.容器和虚拟化的区别
linux容器技术,容器虚拟化和kvm虚拟化的区别
kvm虚拟化: 需要硬件的支持,需要模拟硬件,可以运行不同的操作系统,启动时间分钟级(开机启动流程)
linux开机启动流程:
bios开机硬件自检
根据bios设置的优先启动项boot 网卡 硬盘 u盘 光驱
读取mbr引导 2T UEFI(gpt分区) mbr硬盘分区信息,内核加载路径,
加载内核
启动第一个进程/sbin/init systemd
系统初始化完成
运行服务(nginx,httpd,mysql)等等。
容器启动流程:
共用宿主机内核:
第一个进程直接启动服务(nginx,httpd,mysql)
容器:共用宿主机内核,轻量级,损耗少,启动快,性能高,只能运行在linux系统上
虚拟机:需要硬件的支持,需要模拟硬件,需要走开机启动流程,可以运行不同的操作系统
3.docker 虚拟化理论
Docker是通过进程虚拟化技术(namespaces及cgroups cpu、内存、磁盘io等)来提供容器的资源隔离与安全保障等。由于Docker通过操作系统层的虚拟化实现隔离,所以Docker容器在运行时,不需要类似虚拟机(VM)额外的操作系统开销,提高资源利用率。
namespace 资源隔离
cgroups 进程的资源限制
kvm 虚拟磁盘文件,资源隔离
kvm 资源限制,--cpus --memory
4.docker的主要组成部分
docker是传统的CS架构分为docker client和docker server,向mysql一样
命令:docker version
[root@controller ~]# docker version
Client:
Version: 17.12.0-ce
API version: 1.35
Go version: go1.9.2
Git commit: c97c6d6
Built: Wed Dec 27 20:10:14 2017
OS/Arch: linux/amd64
Server:
Engine:
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的安装
# 清楚旧版本
yum remove docker docker-common docker-selinux docker-engine
# 安装依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
# 下载yum源
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 makecache fast
# 安装docker server client 最新稳定版本
yum install docker-ce docker-ce-cli containerd.io
# 指定安装哪个版本
yum list docker-ce --showduplicates | sort -r
yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
# 启动docker&加入开机自启
systemctl start docker
systemctl enable docker
# 查看版本
docker version
# 查看详细信息
docker info
第二章 镜像加速
docker的主要目标是"Build,Ship and Run any App,Angwhere",构建,运输,处处运行
部署服务,环境问题、一次构建,处处运行 、docker是一种软件的打包技术
官网地址
https://www.daocloud.io/mirror
加速命令
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
阿里镜像加速地址
https://cr.console.aliyun.com/cn-hangzhou/instances/repositories
加速命令
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://ig2l319y.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker
第三章 docker的镜像管理
选镜像的建议:
1,优先考虑官方
2,stars数量多
官方镜像仓库地址:hub.docker.com
获取镜像 docker pull(push)
镜像加速器:阿里云加速器,daocloud加速器,中科大加速器,
Docker 中国官方镜像加速:[https://registry.docker-cn.com](https://registry.docker-cn.com)
官方pull docker pull centos:8(没有指定版本,默认会下载最新版)
私有仓库pull docker pull daocloud.io/huangzhichong/alpine-cn:latest
第四章 docker镜像命令
搜索镜像
docker search
查看镜像列表
docker images or docker image ls
删除镜像
docker rmi 例子:docker image rm centos:latest
导出镜像
docker save 例子:docker image save centos -o docker-centos7.tar.gz
导入镜像
docker load 例子:docker image load -i docker-centos7.tar.gz
第五章 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 分配交互式的终端interactive tty
--name 指定容器的名字
/bin/sh覆盖容器的初始命令
运行容器***
docker run image_name
docker run ==== docker create + docker start
启动容器
docker start ID或NAME
停止容器
docker stop ID或NAME
杀死容器
docker kill container_name
查看容器列表
docker ps(-a -l -q)
查看容器的详细信息
docker inspect 容器ID
进入正在运行的容器(目的,调试,排错)
*** docker exec (会分配一个新的终端tty)
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
docker exec -it 容器id或容器名字 /bin/bash(/bin/sh)
docker attach(使用同一个终端) 偷偷离开的快捷键ctrl+p,ctrl+q
docker attach [OPTIONS] CONTAINER
nsenter(安装yum install -y util-linux 弃用)
删除容器
docker rm
批量删除容器
docker rm -f `docker ps -a -q`
总结:docker容器内的第一个进程(初始命令)必须一直处于前台运行的状态(必须夯住),否则这个容器,就会处于退出状态!
业务在容器中运行:初始命令,夯住,启动服务
第六章 docker容器的网络访问(端口映射)
docker0:172.17.0.1 jumpserver:172.17.0.2 nginx:172.17.0.3
指定映射(docker 会自动添加一条iptables规则来实现端口映射)
docker run -p hostPort:containerPort
docker run -p ip:hostPort:containerPort 多个容器都想使用8080端口
docker run -p ip::containerPort(随机端口)
docker run -p hostPort:containerPort/udp
docker run -p 10.0.0.100::53/udp 使用宿主机的10.0.0.100这个ip地址的随机端口的udp协议映射容器的udp53端口
docker run -p 81:80 –p 443:443 可以指定多个-p
随机映射
docker run -P (随机端口)
通过iptables来实现的端口映射
第七章 docker的数据卷管理
创建目录:
mkdir /data
解压压缩包到/data目录
tar xf xiaoniao.tar.gz -C /data
docker宿主机映射到容器站点目录
docker run -d -p 80:80 -v /data/xiaoniao:/usr/share/nginx/html nginx:latest
映射多个目录
配置文件
cat >/data/game.conf<<EOF
server {
listen 82;
server_name localhost;
location / {
root /data/game/;
index index.html index.htm;
}
}
server {
listen 83;
server_name localhost;
location / {
root /data/xiaoniao/;
index index.html index.htm;
}
}
EOF
docker run -d -p 82:82 -p 83:83 -v /data/xiaoniao:/data/xiaoniao -v /data/game:/data/game -v /data/game.conf:/etc/nginx/conf.d/game.conf nginx:latest
数据卷(文件或目录)
-v 卷名:/data (第一次卷是空,会容器的数据复制到卷中,如果卷里面有数据,把卷数据的挂载到容器中)
-v src(宿主机的目录):dst(容器的目录)
数据卷容器
--volumes-from(跟某一个已经存在的容器挂载相同的卷)
第八章 docker手动将容器保存为镜像
运行centos:7镜像
docker run -it centos:7 /bin/bash
进入容器安装
yum install wget install openssh-clients -y
rm -rf /etc/yum.repos.d/*
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
cat >/etc/yum.repos.d/nginx.repo<<EOF
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/\$releasever/\$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/\$releasever/\$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
EOF
yum makecache fast
yum install nginx -y
scp -r 10.0.0.11:/data/* /opt/
mv /opt/game.conf /etc/nginx/conf.d/
docker ps
docker commit 容器ID game:v1
docker images
docker save game:v1 > game-v1.tar
docker load < game-v1.tar
docker run -p 8080:8080 -p 8090:8090 -d game:v1 nginx -g 'daemon off;'
第九章 自定义一个云盘镜像kod
1.先系统初始化
rm -rf /etc/yum.repos.d/*
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
useradd www -s /sbin/nologin -M
2.安装nginx和php环境
cat >/etc/yum.repos.d/nginx.repo<<EOF
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/\$releasever/\$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/\$releasever/\$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
EOF
yum makecache fast
yum install nginx php-fpm php-mbstring php-gd unzip -y
3.创建nginx配置文件
rm -rf /etc/nginx/conf.d/default.conf
sed -i '/^user/c user www;' /etc/nginx/nginx.conf
sed -i '/^user/c user = www' /etc/php-fpm.d/www.conf
sed -i '/^group/c group = www' /etc/php-fpm.d/www.conf
sed -i '/daemonize/s#no#yes#g' /etc/php-fpm.conf
cat >/etc/nginx/conf.d/kod.conf<<EOF
server {
server_name localhost;
listen 80;
root /code/kod;
index index.php index.html;
location ~ \.php\$ {
root /code/kod;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name;
include fastcgi_params;
}
}
EOF
4.创建代码目录并上传代码
mkdir /code/kod -p
unzip kodexplorer4.40.zip -d /code/kod
chown -R www:www /code
5.启动测试
nginx
php-fpm -c /etc/php.ini -y /etc/php-fpm.conf
6.编写启动脚本
vi /root/go.sh
#!/bin/bash
nginx
php-fpm -c /etc/php.ini -y /etc/php-fpm.conf
7.基于当前的容器提交新镜像
docker commit 容器ID my_kod:v1
8.基于自定义的镜像启动新容器
docker stop $(docker ps -qa)
docker rm $(docker ps -qa)
docker run -d -p 80:80 my_kod:v1 /bin/bash /root/go.sh
9.测试
10.0.0.11
第十章 dockerfile自动构建docker镜像
类似ansible剧本,大小几kb
手动做镜像:大小几百M+
dockerfile 支持自定义容器的初始命令
dockerfile主要组成部分:
基础镜像信息 FROM centos:7
制作镜像操作指令 RUN yum install openssh-server -y
容器启动时执行指令 CMD ["/bin/bash"]
dockerfile常用指令:
FROM 这个镜像的妈妈是谁?(指定基础镜像)
MAINTAINER 告诉别人,谁负责养它?(指定维护者信息,可以没有)
LABLE 描述,标签
RUN 你想让它干啥(在命令前面加上RUN即可)
ADD 给它点创业资金(会自动解压tar) 制作docker基础的系统镜像
WORKDIR 我是cd,今天刚化了妆(设置当前工作目录)
VOLUME 给它一个存放行李的地方(设置卷,挂载主机目录)
EXPOSE 它要打开的门是啥(指定对外的端口)(-P 随机端口)
CMD 奔跑吧,兄弟!(指定容器启动后的要干的事情)(容易被替换)
dockerfile其他指令:
COPY 复制文件(不会解压)rootfs.tar.gz
ENV 环境变量
ENTRYPOINT 容器启动后执行的命令(无法被替换,启容器的时候指定的命令,会被当成参数)
可道云案例:
1.先收集所有需要的配置文件
mkdir /root/dockerfile/{conf,repo,code} -p
docker cp ee59eef3d3a0:/etc/yum.repos.d/CentOS-Base.repo /root/dockerfile/repo/
docker cp ee59eef3d3a0:/etc/yum.repos.d/epel.repo /root/dockerfile/repo/
docker cp ee59eef3d3a0:/etc/yum.repos.d/nginx.repo /root/dockerfile/repo/
docker cp ee59eef3d3a0:/etc/nginx/nginx.conf /root/dockerfile/conf
docker cp ee59eef3d3a0:/etc/nginx/conf.d/kod.conf /root/dockerfile/conf
docker cp ee59eef3d3a0:/etc/php-fpm.d/www.conf /root/dockerfile/conf
docker cp ee59eef3d3a0:/root/go.sh /root/dockerfile/conf
docker cp ee59eef3d3a0:/code/kod /root/dockerfile/code/
2.编写dockerfile
vim /root/dockerfile/dockerfile
0.基础镜像
FROM centos:7
1.系统初始化
RUN useradd www -s /sbin/nologin -M
RUN rm -rf /etc/yum.repos.d/*
ADD repo/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo
ADD repo/epel.repo /etc/yum.repos.d/epel.repo
ADD repo/nginx.repo /etc/yum.repos.d/nginx.repo
2.安装nginx和php环境
RUN yum install nginx php-fpm php-mbstring php-gd unzip -y
RUN yum clean all
3.创建nginx配置文件
ADD conf/nginx.conf /etc/nginx/nginx.conf
ADD conf/kod.conf /etc/nginx/conf.d/kod.conf
ADD conf/www.conf /etc/php-fpm.d/www.conf
ADD conf/go.sh /root/go.sh
4.创建代码目录并上传代码
RUN rm -rf /etc/nginx/conf.d/*
ADD code /code
RUN chown -R www:www /code
5.启动命令
CMD ["/bin/bash","/root/go.sh"]
3.构建镜像
docker build --network=host -t my_kod:v3 .
4.测试新镜像
docker stop $(docker ps -qa)
docker rm $(docker ps -qa)
docker run -d -p 80:80 my_kod:v3