docker镜像制作

tech2024-07-20  60

docker镜像制作

镜像的原理镜像里有什么为什么要自己制作镜像谁去制作镜像镜像制作实例

镜像的原理

镜像是跑在docker容器里的,而容器相当于是是一个进程,内存空间的创建等都是由内核管理的,所以它和内核紧密关联;在一个镜像里面,最底层的是base镜像,base 镜像提供的是最小安装的 Linux 发行版,centos、Ubuntu、debian等,base镜像就相当于是房子的地基,我们在base镜像之上加程序,相当于就是在盖房子,越盖越高,并且只能在上面加,整个房子就是跑在容器里的一个镜像(包含了很多层)。

镜像里有什么

操作系统、核心代码、工具、库

为什么要自己制作镜像

答案: 1.别人的不能满足我们的需要 2.外部的不够安全,有安全隐患

谁去制作镜像

一般都是开发人员去制作,也可以是运维人员去制作、权利非常大的工作人员。

镜像制作实例

我们首先来看下官方的一个例子(做了一些修改) 1.新建一个空目录 [root@Mariadb ~]# mkdir mydocker [root@Mariadb ~]# cd mydocker/ 2.新建Dockerfile [root@Mariadb mydocker]# vim Dockerfile # Use an official Python runtime as a parent image 下载一个python最新的镜像模板,已经有操作系统和安装好python3 FROM python # Set the working directory to /app #在docker容器里的工作目录 WORKDIR /app # Copy the current directory contents into the container at /app ADD . /app VOLUME ["/data_flask"] # Install any needed packages specified in requirements.txt #RUN pip install --trusted-host pypi.python.org -r requirements.txt RUN pip install -i https://pypi.douban.com/simple/ -r requirements.txt # Make port 80 available to the world outside this container EXPOSE 80 # Define environment variable ENV NAME World # Run app.py when the container launches CMD ["python", "app.py"] 3.新建requirements.txt文件 [root@Mariadb mydocker]# vim requirements.txt [root@Mariadb mydocker]# cat requirements.txt Flask Redis [root@Mariadb mydocker]# 4.新建app.py文件 [root@Mariadb mydocker]# vim app.py [root@Mariadb mydocker]# cat app.py from flask import Flask from redis import Redis, RedisError import os import socket # Connect to Redis 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]# ls app.py Dockerfile requirements.txt [root@Mariadb mydocker]# 5.生成镜像,需要一点时间,因为下载安装很多东西 [root@Mariadb mydocker]# docker build -t sc_flask_app . 6.查看生成的镜像 [root@sc-docker mydocker]# docker images 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]# docker run -d -p 4000:80 --name sc_cali1 sc_flask_app 查看运行的容器 [root@sc-docker mydocker]# docker ps 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 ~]# curl 127.0.0.1:4000 <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]# cat Dockerfile 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 #容器里接受终止进程的信号为SIGTERM STOPSIGNAL SIGTERM #ENTRYPOINT ["nginx"] #docker容器中pid为1的进程结束, 容器也就停止运行 CMD ["nginx","-g","daemon off;"]
最新回复(0)