docker镜像(1)
一、docker基础
Docker容器的特点:
- Docker主要是为了解决应用的库依赖和隔离应用
- Docker相对于虚拟机比较轻量,易管理
Doker和虚拟化区别:
doker是上层和宿主机使用同一套硬件,与宿主机使用同一个内核,仅在应用层实现了隔离。
虚拟化里面的虚拟机,CPU和内存、硬盘等都是虚拟的,并不是和宿主机使用同一套硬件。
容器的临时性:
-
容器里的操作当容器删除了就没了
-
最好不要把数据存储在容器里
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镜像的分类
- 基础镜像,可以去docker.io上下载,也可以在国内的Docker仓库下载
- 自定义镜像,可以基于基础镜像实现镜像的自定义
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
//再次查看,发现多了一个镜像
镜像导出备份,删除和导入
重命名: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:查看运行的容器,类似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使用说明
- FROM,基于哪个基础镜像
- MAINTAINER,代表维护者信息,填写个邮箱即可。
- COPY,往镜像里添加文件
- RUN,运行命令构建镜像
- ENTRYPOINT,镜像启动时运行的命令,不可替换
- 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镜像启动注意
-
默认nginx以daemon的方式启动,无永久运行的程序,容器会马上退出:/usr/local/nginx/sbin/nginx
-
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镜像
多进程镜像需求
-
Docker容器启动一个进程对于微服务是比较有用的
-
但有时候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"