docker镜像制作
镜像的原理镜像里有什么为什么要自己制作镜像谁去制作镜像镜像制作实例
镜像的原理
镜像是跑在docker容器里的,而容器相当于是是一个进程,内存空间的创建等都是由内核管理的,所以它和内核紧密关联;在一个镜像里面,最底层的是base镜像,base 镜像提供的是最小安装的 Linux 发行版,centos、Ubuntu、debian等,base镜像就相当于是房子的地基,我们在base镜像之上加程序,相当于就是在盖房子,越盖越高,并且只能在上面加,整个房子就是跑在容器里的一个镜像(包含了很多层)。
镜像里有什么
操作系统、核心代码、工具、库
为什么要自己制作镜像
答案: 1.别人的不能满足我们的需要 2.外部的不够安全,有安全隐患
谁去制作镜像
一般都是开发人员去制作,也可以是运维人员去制作、权利非常大的工作人员。
镜像制作实例
我们首先来看下官方的一个例子(做了一些修改)
1.新建一个空目录
[root@Mariadb ~
]
[root@Mariadb ~
]
2.新建Dockerfile
[root@Mariadb mydocker
]
FROM python
WORKDIR /app
ADD
. /app
VOLUME
["/data_flask"]
RUN pip
install -i https://pypi.douban.com/simple/ -r requirements.txt
EXPOSE 80
ENV NAME World
CMD
["python",
"app.py"]
3.新建requirements.txt文件
[root@Mariadb mydocker
]
[root@Mariadb mydocker
]
Flask
Redis
[root@Mariadb mydocker
]
4.新建app.py文件
[root@Mariadb mydocker
]
[root@Mariadb mydocker
]
from flask
import Flask
from redis
import Redis, RedisError
import os
import socket
redis
= Redis
(host
="redis", db
=0, socket_connect_timeout
=2, socket_timeout
=2
)
app
= Flask
(__name__
)
@app.route
("/")
def hello
():
try:
visits
= redis.incr
("counter")
except RedisError:
visits
= "<i>cannot connect to Redis, counter disabled</i>"
html
= "<h3>Hello {name}!</h3>" \
"<b>Hostname:</b> {hostname}<br/>" \
"<b>Visits:</b> {visits}"
return html.format
(name
=os.getenv
("NAME",
"world"), hostname
=socket.gethostname
(), visits
=visits
)
if __name__
== "__main__":
app.run
(host
='0.0.0.0', port
=80
)
[root@Mariadb mydocker
]
一共3个文件
[root@Mariadb mydocker
]
app.py Dockerfile requirements.txt
[root@Mariadb mydocker
]
5.生成镜像,需要一点时间,因为下载安装很多东西
[root@Mariadb mydocker
]
6.查看生成的镜像
[root@sc-docker mydocker
]
REPOSITORY TAG IMAGE ID CREATED SIZE
sc_flask_app latest e7236129d51e 27 minutes ago 892MB
nginx latest 4bb46517cac3 2 weeks ago 133MB
python latest 79cc46abd78d 2 weeks ago 882MB
redis latest 1319b1eaa0b7 3 weeks ago 104MB
mysql 5.7.31 718a6da099d8 3 weeks ago 448MB
[root@sc-docker mydocker
]
7.运行容器
[root@Mariadb mydocker
]
查看运行的容器
[root@sc-docker mydocker
]
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c2ad8485ace1 sc_flask_app
"python app.py" 11 minutes ago Up 11 minutes 0.0.0.0:4000-
>80/tcp sc_cali1
[root@sc-docker mydocker
]
8.在另外一个终端访问,效果如下:
[root@Mariadb ~
]
<h3
>Hello World
!</h3
><b
>Hostname:
</b
> 102212ba7691
<br/
><b
>Visits:
</b
> <i
>cannot connect to Redis, counter disabled
</i
>
[root@Mariadb ~
]
因为redis服务没有安装,所有连接不到redis数据库,可以启动一个redis的容器,链接到现在的这个容器。
下面是制作redis数据库的文档
http://www.runoob.com/docker/docker-install-redis.html
其中:FROM python是获取一个基础镜像;WORKDIR /app指定工作目录(登陆到容器后进入的目录);ADD . /app把当前目录下的内容添加到容器里的/app目录下;VOLUME ["/data_flask"]将数据卷挂载到容器里实现数据共享;RUN pip install -i https://pypi.douban.com/simple/ -r requirements.txt在镜像上再添加一些程序;EXPOSE 80容器开放80端口;ENV NAME World定义环境变量NAME的值为 World;CMD [“python”, “app.py”]启动容器时执行的第一个命令。
下面我们自己制作一个nginx(编译安装)的镜像
[root@sc-docker nginx
]
FROM centos
MAINTAINER califeng
WORKDIR /
COPY nginx-1.19.2.tar.gz /
RUN yum
install zlib zlib-devel openssl openssl-devel pcre pcre-devel gcc gcc-c++ autoconf automake
make -y \
&& tar xf nginx-1.19.2.tar.gz \
&& cd nginx-1.19.2 \
&& ./configure --prefix
=/usr/local/nginx8 --with-threads --with-file-aio --with-http_ssl_module --with-http_stub_status_module --with-stream \
&&make -j 2
; make install \
&& sed -i
'44 c root /app ;' /usr/local/nginx8/conf/nginx.conf
ENV PATH /usr/local/nginx8/sbin:
$PATH
EXPOSE 80
STOPSIGNAL SIGTERM
CMD
["nginx",
"-g",
"daemon off;"]