docker镜像(1)

一、docker基础

Docker容器的特点

  • Docker主要是为了解决应用的库依赖和隔离应用
  • Docker相对于虚拟机比较轻量,易管理

Doker和虚拟化区别

doker是上层和宿主机使用同一套硬件,与宿主机使用同一个内核,仅在应用层实现了隔离。

虚拟化里面的虚拟机,CPU和内存、硬盘等都是虚拟的,并不是和宿主机使用同一套硬件。

容器的临时性:

  1. 容器里的操作当容器删除了就没了

  2. 最好不要把数据存储在容器里

centos7安装docer

//安装
yum remove docker-common
cd /etc/yum.repos.d/
wget http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install docker-ce -y
systemctl enable docker
systemctl restart docker
docker version
docker info

//卸载
yum remove docker -y
\rm -rf /var/lib/docker/

Docker镜像的分类

  1. 基础镜像,可以去docker.io上下载,也可以在国内的Docker仓库下载
  2. 自定义镜像,可以基于基础镜像实现镜像的自定义

Docker镜像的相关命令

//查看镜像,刚安装完是空的
docker images

//搜索与centos相关的镜像
docker search centos

//下载一个centos7的镜像,速度很慢,因为在国外,不用这种方式下载
docker pull centos:7

//Docker仓库的配置/etc/docker/daemon.json,重启Docker
{
 "registry-mirrors": ["http://hub-mirror.c.163.com/"]
}

//重启docker
systemctl restart docker

//使用163的源进行下载
docker pull hub-mirror.c.163.com/library/centos:7
systemctl restart docker

//再次查看,发现多了一个镜像

img

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

重命名: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容器概念

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

容器说明

容器里的系统跟宿主系统是独立的

容器的删除、崩溃等不会影响到宿主系统

使用Centos7镜像启动容器

docker run -it centos:7 /bin/bash   #i表示交互式,t表示打开一个Shell窗口,会进入一个全新的系统

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

docker ps:查看运行的容器,类似ifconfig
docker ps -a:查看所有容器,类似ifconfig -a

docker inspect eafaf794e11d:查看容器详细信息

docker logs eafaf794e11d:查看容器日志

//正在运行的容器无法删除,除非是在是处于停止(exited)状态的容器
docker rm eafaf794e11d:删除容器
docker rm -f eafaf794e11d :强制删除容器

容器后台运行的特点

如果没有永久运行的程序,终端一退出容器就会马上退出。

容器永久运行的条件:需要有永久运行的程序,并且使用run -d后台启动容器。

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

//启动后台容器,docker log ID,就能查看到对外输出的
docker run -d centos:7 /bin/bash -c "while true;do echo zhanghe; sleep 5; done"
//查看日志
[root@doker ~]# docker logs 2e8
zhanghe
zhanghe
zhanghe

进入后台容器:docker exec -it ID /bin/bash

后台容器的停止

停止后台容器:docker stop ID 或者 docker kill ID

启动容器:docker start ID

删除容器:docker rm ID

批量删除容器:docker rm -f ID1 ID2

因为容器删除后数据就会跟着消失的特性,所以不适合做存储方面的业务。

刚起容器的时候发现不能上网,不能上网就无法安装软件,费劲的找了好我办法,没想到呀,没想到,竟然重启一下docker服务就可以了!!!!!

二、自定义镜像

为什么要自定义镜像呢?

我们从仓库里面下载的镜像都是初始的系统,都是比较干净的,最小化的,里面没有任何的程序,并不能满足我们实际的要求,所以当我们下载完一个初始镜像之后,要做一些操作,比如我们要部署好一些基本工具:yum、net-tools之后,当当前的状态打包成为一个镜像,这样我们再起容器的时候,可以根据这个镜像起新的容器,这样看来,这有有点像是vmware的快照功能。制作镜像是非常重要的。

自定义镜像有两种方式:commit方式和docerfile的方式,其中最常用的是dockerfile的方式。先讲一下commit这种方式。

commit

给基础镜像新增一个while程序

[root@docker1 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              7                   5e35e350aded        2 months ago        203M

docker run -it centos:7 /bin/bash

root@3c9e1ec80d63 ~]# vi /usr/bin/while.sh 
#!/bin/bash
while true
do
	echo 123
	sleep 3
done

//加执行权限
[root@3c9e1ec80d63 ~]# chmod +x /usr/bin/while.sh 


//暂时先不要退出容器,另开一个终端,通过ps -a发现有一个容器正在运行
[root@docker1 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             
3c9e1ec80d63        centos:7            "/bin/bash"         8 minutes ago     

//就通过这个镜像制作模板镜像,镜像的名字就是centos:if
[root@docker1 ~]# docker commit 3c9e1ec80d63 centos:if

//查看时发现多了一个镜像
[root@docker1 ~]# docker images  
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              if                  df01e399db22        37 seconds ago      203MB
centos              7                   5e35e350aded        2 months ago        203MB
//根据新的镜像再起容器就会发现已经有了while.sh
[root@docker1 ~]# docker run -it centos:if /bin/bash

dockerfile

上面所演示的是commit的方式制作镜像,下面演示一下通过dockerfile的方式来制作镜像,这种制作镜像的方式比较主流, Dockerfile能把制作镜像的过程写入到配置文件中。

Dockerfile使用说明

  1. FROM,基于哪个基础镜像
  2. MAINTAINER,代表维护者信息,填写个邮箱即可。
  3. COPY,往镜像里添加文件
  4. RUN,运行命令构建镜像
  5. ENTRYPOINT,镜像启动时运行的命令,不可替换
  6. CMD,镜像启动时运行的命令,可替换

简单需求演示:

替换Centos7基础镜像中的yum源为163的yum源

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

[root@docker1 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              if                  df01e399db22        26 minutes ago      203MB
centos              7                   5e35e350aded        2 months ago        203MB
[root@docker1 ~]# mkdir -p /docker/yum163/
[root@docker1 ~]# vim /docker/yum163/Dockerfile
FROM centos:7
MAINTAINER zhanghehe 361589194@qq.com
COPY CentOS-Base.repo /etc/yum.repos.d/  #这个文件要在当根目录/docker/yum163/下
RUN yum -y install net-tools
[root@docker1 ~]# cp /etc/yum.repos.d/CentOS-Base.repo /docker/yum163/
[root@docker1 ~]# ls /docker/yum163/
CentOS-Base.repo  Dockerfile


//制作一个centos7:163的镜像,后面是根目录
docker build -t centos7:163 /docker/yum163/

//查看验证
root@docker1 ~]# docker images;
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos7             163                 8d669991c3ee        8 minutes ago       203MB
centos              if                  df01e399db22        39 minutes ago      203MB
centos              7                   5e35e350aded        2 months ago        203MB

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

三、定义nginx镜像

定义一个nginx镜像其实很简单,但是有一些要注意的地方 ,比如nginx要在本地安装没有问题之后才能去docker里面安装。而且从nginx官网下载nginx有些慢,我们可以将nginx先在宿主机上安装,然后把nginx的安装包放在根目录里面,在容器里面通过wget直接从宿主的根目录里面下载。

Nginx镜像启动注意

  1. 默认nginx以daemon的方式启动,无永久运行的程序,容器会马上退出:/usr/local/nginx/sbin/nginx

  2. Nginx使用永久运行的方式:/usr/local/nginx/sbin/nginx -g "daemon off;"

Dockerfile文件/docker/nginx/Dockerfile

[root@docker1 ~]# mkdir /docker/nginx
[root@docker1 nginx]# vim Dockerfile
FROM centos:7
COPY install.sh /tmp/install.sh
RUN sh /tmp/install.sh
COPY run /usr/bin/run
ENTRYPOINT ["run"]

//Nginx安装脚本/docker/nginx/install.sh
yum install -y wget tar gcc gcc-c++ make pcre pcre-devel zlib zlib-devel lrzsz
cd /usr/local/src
wget 'http://192.168.80.61/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/*
[root@docker1 nginx]# chmod +x install.sh

//编写启动脚本run,加执行权限
[root@docker1 nginx]## vim run
#!/bin/bash
/usr/local/nginx/sbin/nginx -g "daemon off;" 
[root@docker1 nginx]# chmod +x run 

制作Nginx镜像

docker build -t centos:nginx /docker/nginx/
docker inspect centos:nginx

后台启动容器测试

docker run -d centos:nginx
[root@docker1 nginx]# docker ps -a     
fd415027a7bd        centos:nginx        "run"               5 seconds ago       Up 5 
docker exec -it fd415027a7bd /bin/bash

默认Docker网络是在内网的,外面无法访问,后面会专门介绍网络

四、定义redis镜像

定义redis镜像的思路与定义nginx镜像的思路是一样的。

[root@docker1 ~]# mkdir /docker/redis
[root@docker1 ~]# cd /docker/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://192.168.80.61/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/*
//编写启动脚本/docker/redis/sjgrun,加执行权限

#!/bin/bash
/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf
//Redis镜像制作配置文件/docker/redis/Dockerfile
FROM centos7:163
COPY install.sh /tmp/install.sh
RUN sh /tmp/install.sh
COPY sjgrun /usr/bin/sjgrun
CMD ["sjgrun"]
//构建Redis镜像
docker build -t centos:redis /docker/redis/
[root@docker1 redis]# docker run -d centos:redis
7e8ff4a98eb21451eb3a7eb373c09429d7148f31b5d3da1dd0beb4bea39b6457
[root@docker1 redis]# docker ps -a
7e8ff4a98eb2        centos:redis        "sjgrun"            13 seconds ago      Up 13 
[root@docker1 redis]# docker exec -it 7e8 /bin/bash
[root@7e8ff4a98eb2 /]# ps auxfww | grep redis
/usr/local/redis/bin/redis-server 127.0.0.1:6379

五、定义nginx+redis镜像

多进程镜像需求

  1. Docker容器启动一个进程对于微服务是比较有用的

  2. 但有时候Docker容器需要负责一个业务,一个业务往往有多个进程

[root@docker1 ~]# mkdir /docker/multiproc
[root@docker1 ~]# cd /docker/multiproc

//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://192.168.80.61/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://192.168.80.61/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:163
COPY install_nginx.sh install_redis.sh /tmp/
RUN sh /tmp/install_nginx.sh
RUN sh /tmp/install_redis.sh
COPY sjgrun /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 ["sjgrun"]
//编写启动脚本/docker/multiproc/sjgrun,加执行权限
#!/bin/bash
/usr/local/nginx/sbin/nginx
/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf
[root@docker1 multiproc]# chmod +x install_nginx.sh install_redis.sh sjgrun 
[root@docker1 multiproc]# ls
Dockerfile  install_nginx.sh  install_redis.sh  sjgrun

Nginx+Redis镜像构建

docker build -t centos:web /docker/multiproc/
//测试Nginx+Redis镜像
docker run -d centos:web
docker ps -a
docker exec -it e1f /bin/bash
ps auxfww | grep -E "nginx|redis"
posted @ 2020-01-15 16:43  张贺贺呀  阅读(279)  评论(0编辑  收藏  举报