首页 > 其他 > 详细

docker 详解

时间:2020-05-09 02:04:12      阅读:87      评论:0      收藏:0      [点我收藏+]

本文,只是用于个人学习用途,请到其他的博客查看,docker教程

推荐视频学习地址:https://edu.51cto.com/

学习

  • Docker容器基础
  • Docker自定义镜像
  • Docker网络模式和特权指令
  • Doker-compose操作容器
  • Harbor镜像仓库

 

Docker容器基础

安装Docker CE社区版

yum remove docker-common -y
cd /etc/yum.repos.d/ 
wget http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 
yum -y install docker-ce 
docker version
[root@localhost ~]# systemctl list-unit-files |grep docker
docker.service                                disabled
docker.socket                                 disabled
[root@localhost ~]# systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
[root@localhost ~]# systemctl start docker

 

Docker 镜像的分类

  • 基础镜像,也就是官方的镜像,官方地址是docker.io
  • 自定义镜像

Docker镜像的相关命令 

docker images 
docker search centos 
docker pull centos:7 #pull就是下载的意思

 

标识Docker镜像 , 如centos:7 ,镜像名是centos, 版本号是7

  • 镜像名 
  • 版本号
[root@localhost ~]# docker pull centos:7
7: Pulling from library/centos
524b0c1e57f8: Pull complete 
Digest: sha256:e9ce0b76f29f942502facd849f3e468232492b259b9d9f076f71b392293f1582
Status: Downloaded newer image for centos:7
docker.io/library/centos:7
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              7                   b5b4d78bc90c        2 days ago          203MB
[root@localhost ~]# 

镜像导出备份,删除和导入 

重命名:docker tag hub-mirror.c.163.com/library/centos:7 centos:7 
导出镜像:docker save hub-mirror.c.163.com/library/centos:7 >/tmp/centos.tar 
删除镜像:docker rmi centos:7 
镜像导入:docker load < /tmp/centos7.tar

 

Docker容器概念 

  • 可以使用镜像生成对应运行的容器,一个镜像可以生成多个容器 
  • Centos7镜像生成的容器系统是Centos7,Ubuntu镜像生成的容器系统是Ubuntu的

 

使用Centos7镜像启动容器 

docker run -it centos:7 /bin/bash 
# i表示交互式,t表示打开一个Shell窗口 

 

容器说明 

  • 容器里的系统跟宿主系统是独立的 
  • 容器的删除、崩溃等不会影响到宿主系统 

 

宿主机上查看容器的相关操作 

  • docker ps:查看运行的容器。docker ps -a:查看所有容器 
  • docker inspect container_ID:查看容器详细信息 
  • docker logs container_ID:查看容器内敲的命令以及命令的输出
  • docker rm container_ID:删除容器,docker rm -f:强制删除容器 

容器后台运行的特点 

  • 如果没有永久运行的程序,终端一退出容器就会马上退出 
  • 容器永久运行的条件:需要有永久运行的程序,并且使用run -d后台启动容器

 

怎么样启动一个永久运行的容器 

  • 启动后台容器:docker run -d centos:7 /bin/bash -c "while true;do echo shijiange; sleep 5; done" 
  • 进入后台容器:docker exec -it xxx /bin

后台容器的停止 

  • 停止后台容器:docker stop xxx 或者 docker kill xxx 
  • 删除容器:docker rm xxx 
  • 批量删除容器:docker rm -f xxx xxx

Docker自定义镜像

容器的临时性 

  • 1. 容器里的操作当容器删除了就没了 
  • 2. 最好不要把数据存储在容器里

 

Docker自定义镜像 

  • 3. 一般自带的镜像无法满足特定的要求,需要基于基础镜像来自定义Docker镜像 
  • 4. 玩Docker,镜像制作很重要

两种方式构建自定义镜像

  • commit 构建自定义镜像
  • dockerfile 构建自定义镜像

 

查看基础镜像信息 

  • docker inspect centos:7 | less 

给基础镜像新增ifconfig命令和一个while程序 

  • docker run -it centos /bin/bash 
  • yum install net-tools -y 
  • 写一个永久运行的程序well_done,放置到/usr/bin/目录下,加755权限
  • #!/bin/bash
    while true
    do
        echo "well done"
        sleep 5
    done

     

Commit生成一个新镜像 --非主流做法

  • docker commit container_ID centos:if 
  • docker images 
  • docker inspect centos:if 
  • docker run -d centos:if /bin/bash -c well_done

tag如果没指定,默认就是latest 

  • docker tag centos:7 centos:latest 
  • docker inspect centos

dockerfile生成一个新镜像---主流的方式

Dockerfile能把制作镜像的过程写入到配置文件中

Dockerfile使用说明 

  • FROM,基于哪个基础镜像 
  • MAINTAINER,代表维护者信息 
  • COPY,往镜像里添加文件 
  • RUN,运行命令构建镜像 
  • ENTRYPOINT,镜像启动时运行的命令,不可替换 
  • CMD,镜像启动时运行的命令,可替换

 

最简单需求 

  • 替换Centos7基础镜像中的yum源为163的yum源 
  • 安装ifconfig命令

Dockerfile配置文件实战:/docker/yum163/Dockerfile 

FROM centos:7 
MAINTAINER shijiange 361589194@qq.com 
COPY CentOS-Base.repo /etc/yum.repos.d/ 
RUN yum -y install net-tools

/docker/yum163/CentOS-Base.repo

[base]
name=CentOS-$releasever - Base
baseurl=http://mirrors.163.com/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
[updates]
name=CentOS-$releasever - Updates
baseurl=http://mirrors.163.com/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
[extras]
name=CentOS-$releasever - Extras
baseurl=http://mirrors.163.com/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

dockerfile 镜像制作命令 

  • docker build -t centos7:163 /docker/yum163/ 
  • 测试是否制作成功 docker run -it centos7:163 /bin/bash

 

docker镜像制作实战练习

实战01制作nginx镜像

 

Nginx安装脚本/docker/nginx/install.sh 

 

yum install -y wget tar gcc gcc-c++ make pcre pcre-devel zlib zlib-devel 
cd /usr/local/src 
wget http://nginx.org/download/nginx-1.14.2.tar.gz 
tar -zxf nginx-1.14.2.tar.gz 
cd nginx-1.14.2 
./configure --prefix=/usr/local/nginx && make && make install 
\rm -rf /usr/local/src/

Nginx镜像启动注意 

  • 默认nginx以daemon的方式启动,无永久运行的程序,容器会马上退出:/usr/local/nginx/sbin/nginx 
  • Nginx使用永久运行的方式:/usr/local/nginx/sbin/nginx -g "daemon off;"

Dockerfile文件/docker/nginx/Dockerfile 

FROM centos:7 
COPY install.sh /tmp/install.sh 
RUN sh /tmp/install.sh 
COPY gotorun /usr/bin/gotorun 
ENTRYPOINT ["gotorun"]

编写启动脚本gotorun,加执行权限

#!/bin/bash
/usr/local/nginx/sbin/nginx -g "daemon off;

  

制作Nginx镜像 

  • docker build -t centos7:nginx /docker/nginx/ 
  • docker inspect centos7:nginx

后台启动容器测试 

  • docker run -d centos7:nginx 
  • 默认Docker网络是在内网的,外面无法访问,后面会专门介绍网络

实战02制作redis镜像

默认

Redis安装脚本/docker/redis/install.sh 

yum install -y wget gcc gcc-c++ make tar openssl openssl-devel cmake 
cd /usr/local/src 
wget http://download.redis.io/releases/redis-4.0.9.tar.gz 
tar -zxf redis-4.0.9.tar.gz 
cd redis-4.0.9 
make && make PREFIX=/usr/local/redis install 
mkdir -pv /usr/local/redis/conf/ 
cp redis.conf /usr/local/redis/conf/ 
\rm -rf /usr/local/src/*

Redis镜像制作配置文件/docker/redis/Dockerfile 

FROM centos:7 
COPY install.sh /tmp/install.sh 
RUN sh /tmp/install.sh 
COPY gotorun /usr/bin/gotorun 
CMD ["gotorun"]  

编写启动脚本/docker/redis/gotorun,加执行权限 

#!/bin/bash 
/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf

构建Redis镜像 

  • docker build -t centos7:redis /docker/redis/ 
  • 测试Redis镜像

实战03制作nginx + redis 多进程镜像

多进程镜像需求 

  • Docker容器启动一个进程对于微服务是比较有用的 
  • 但有时候Docker容器需要负责一个业务,一个业务往往有多个进程

Nginx安装脚本/docker/multiproc/install_nginx.sh 

yum install -y wget tar gcc gcc-c++ make pcre pcre-devel zlib zlib-devel 
cd /usr/local/src 
wget http://nginx.org/download/nginx-1.14.2.tar.gz 
tar -zxf nginx-1.14.2.tar.gz 
cd nginx-1.14.2 
./configure --prefix=/usr/local/nginx && make && make install 
\rm -rf /usr/local/src/*

Redis安装脚本/docker/multiproc/install_redis.sh 

yum install -y wget gcc gcc-c++ make tar openssl openssl-devel cmake 
cd /usr/local/src 
wget http://download.redis.io/releases/redis-4.0.9.tar.gz 
tar -zxf redis-4.0.9.tar.gz 
cd redis-4.0.9 
make && make PREFIX=/usr/local/redis install 
mkdir -pv /usr/local/redis/conf/ 
cp redis.conf /usr/local/redis/conf/
\rm -rf /usr/local/src/*

Dockerfile配置:/docker/multiproc/Dockerfile 

FROM centos:7
COPY install_nginx.sh install_redis.sh /tmp/ 
RUN sh /tmp/install_nginx.sh 
RUN sh /tmp/install_redis.sh 
COPY gotorun /usr/bin/
RUN sed -i -e s/bind 127.0.0.1/bind 0.0.0.0/g /usr/local/redis/conf/redis.conf 
ENTRYPOINT ["gotorun"]

编写启动脚本/docker/multiproc/gotorun,加执行权限 

#!/bin/bash 
/usr/local/nginx/sbin/nginx 
/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf

Nginx+Redis镜像构建 

  • docker build -t centos7:web /docker/multiproc/ 
  • 测试Nginx+Redis镜像

docker网络模式和特权指令

查看网络方式

docker network ls 
NETWORK ID NAME DRIVER SCOPE 
c017726e1c76 bridge bridge local 
2f0bce224260 host host local 
b488b8ca5419 none null local

Docker容器的网络模式 

  • bridge模式,让容器跟docker0网卡桥接。上网通过nat上网 
  • host模式,让容器和宿主机共享网络 
  • none,关闭容器网络

Docker默认的网络方式观察 

  • docker run -d centos7:nginx 
  • yum install bridge-utils -y 
  • brctl show 
  • 桥接docker0默认外部无法访问进去,得开通映射才能访问进去

桥接docker0加端口映射可以实现跟外界通讯 

  • docker run -d -p 8080:80 centos7:nginx 
  • docker run -d -p 192.168.237.50:8080:80 centos7:nginx 
  • 多端口映射docker run -d -p 8080:80 -p 6381:6379 centos7:web

使用host模式,直接使用宿主机的网络,可直接外界通讯 

  • docker run --net=host -d centos7:web 
  • 直接就能外网通讯 
  • 运行ifconfig查看网卡信息

使用none模式,关闭容器网络,用得比较少 

  • docker run --net=none -d centos7:web 
  • 只有127.0.0.1网

容器文件共享和特权模式

 

业务上有时候有如下需求 

  •  网站更新放到宿主机上 
  • 日志放到宿主机上

容器和宿主机怎么做文件共 ,比较常用

  • 创建目录:mkdir -pv /centos7/logs /centos7/apps 
  • 共享网站和日志:docker run --net=host -d -v /centos7/logs:/usr/local/nginx/logs -v /centos7/apps:/usr/local/nginx/html/apps centos7:nginx 
  • 测试是否能共享成功

Docker使用特权的方式去启动容器,无特权很多命令无法运行 ,用的比较少

  • 启动一个测试的容器:docker run -d -v /centos7/logs:/usr/local/nginx/logs -v /centos7/apps:/usr/local/nginx/html/apps centos7:nginx 
  • route del default gw 172.17.0.1 
  • docker run --privileged=true -d centos7:nginx

 

docker 详解

原文:https://www.cnblogs.com/faberbeta/p/12853704.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!