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
上一篇下一篇

猜你喜欢

热点阅读