docker镜像的制作

docker镜像

        docker镜像是一个轻量级、可移植的打包文件,包含了运行应用程序所需的所有代码、库、依赖项和配置信息。通过使用docker镜像,可以快速地部署和运行应用程序,而无需担心环境差异、依赖项问题等。

制作Docker镜像需要以下文件:

  1. Dockerfile:Dockerfile是一个文本文件,包含了构建docker镜像的指令和命令。在Dockerfile中,可以指定镜像的基础操作系统、安装软件包、配置环境变量、设置工作目录等。
  2. 应用程序代码:将应用程序代码放入Docker镜像中,可以使镜像更加完整和独立,避免依赖于外部文件和环境。
  3. 依赖项:如果应用程序需要依赖其他软件包或库,需要将这些依赖项打包到Docker镜像中。
  4. 配置文件:应用程序的配置文件也应该包含在Docker镜像中,方便在不同环境中部署和运行。

Dockerfile命令

  1. FROM:指定基础镜像,即构建新镜像所需要的基础镜像。 例子:
FROM centos
  1. RUN:在镜像中执行命令,用于安装软件包、运行编译器、创建文件等操作。例子:
RUN yum install -y nginx && mkdir /hello
  1. COPY:将本地文件复制到容器中。 例子:
COPY index.html /usr/share/nginx/html/
  1. ADD:和 COPY 类似,但可以自动解压缩压缩文件。 例子:
ADD myapp.tar.gz /opt/
  1. WORKDIR:设置工作目录。 例子:
WORKDIR /usr/share/nginx/html/
  1. EXPOSE:声明容器需要监听哪些端口。 例子:
EXPOSE 80
  1. CMD:指定容器启动时需要运行的命令。 例子:
CMD ["nginx", "-g", "daemon off;"]
  1. ENTRYPOINT:指定容器启动时需要运行的命令,并可以接受命令行参数。 例子:
ENTRYPOINT ["echo", "Hello"]
CMD ["world"]

当ENTRYPOINT和CMD都存在的时候,CMD里的内容会成为ENTRYPOINT里的参数(位置参数)

  1. ENV:设置环境变量,格式为ENV key value。例子:
 ENV LANG en_US.UTF-8
  1. ARG:定义构建时的参数,格式为ARG name=value。例子:
ARG VERSION=1.0
  1. VOLUME:指定容器中的目录为挂载点。例子:
VOLUME /data

docker镜像示例

制作一个简单的python镜像

  1. 安装Docker:安装docker,如果没有安装docker,可以看这篇博客docker安装启动

  2. 选择Python版本:选择使用Python 3.9版本。

  3. 创建Dockerfile:在项目根目录下创建一个名为Dockerfile的文件,并在其中编写以下代码:

# 基础镜像
FROM python:3.9

# 设置工作目录
WORKDIR /app

# 将当前目录下的所有文件拷贝到工作目录下
COPY . /app

# 安装依赖包
RUN pip install -r requirements.txt

# 暴露端口
EXPOSE 5000

# 启动命令
CMD ["python", "app.py"]
  1. 编写应用程序:在项目根目录下创建一个名为app.py的文件,并在其中编写Python代码,编写一个简单的Flask应用程序:
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello, Docker!'

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0')
  1. 编写requirements.txt:在项目根目录下创建一个名为requirements.txt的文件,并在其中列出应用程序所需的Python依赖项,我们只需要Flask:
Flask==2.0.1
  1. 构建镜像:在终端中导航到项目根目录(当前目录),并运行以下命令来构建镜像:
docker build -t my-python-app .
[root@xia mydocker]# pwd
/mydocker
[root@xia mydocker]# ls
app.py  Dockerfile  requirements.txt
[root@xia mydocker]# docker build -t my-python-app .
[+] Building 16.8s (9/9) FINISHED                                                                                                                    
 => [internal] load build definition from Dockerfile                         0.0s                                                               0.0s
 => => transferring dockerfile: 289B                                         0.0s                                                               0.0s
 => [internal] load .dockerignore                                            0.0s                                                               0.0s
 => => transferring context: 2B                                              0.0s                                                               0.0s
 => [internal] load metadata for docker.io/library/python:3.9               16.7s                                                              15.8s
 => [1/4] FROM docker.io/library/python:3.9@sha256:2d8875d28ca023a9056a8285  0.0s
 => [internal] load build context                                            0.0s
 => => transferring context: 93B                                             0.0s
 => CACHED [2/4] WORKDIR /app                                                0.0s
 => CACHED [3/4] COPY . /app                                                 0.0s
 => CACHED [4/4] RUN pip install -r requirements.txt                         0.0s
 => exporting to image                                                       0.0s
 => => exporting layers                                                      0.0s
 => => writing image sha256:ad91c41fdc09fba455d0e0b1febfd943c12918c167e035e  0.0s
 => => naming to docker.io/library/my-python-app                             0.0s
  1. 运行容器:运行以下命令来启动容器:
docker run -d -p 5000:5000 --name my-python-1 my-python-app
  1. 浏览器访问

制作一个简单的go镜像

  1. 创建一个新的目录,用于存储我们的Dockerfile和其他相关文件,在该目录下,创建一个名为Dockerfile的文件,并在其中添加以下内容。

  2. 设置基础镜像

FROM golang:latest
  1. 将工作目录设置为/go
WORKDIR /go
  1. 将当前目录中的所有文件复制到容器的/app目录下
COPY . /go
  1. 暴露端口
 EXPOSE 8080
  1. 容器启动时运行的命令
CMD ["/go/main"]
  1. 编写一个简单的go应用程序,例如:
package main
import (
    "fmt"
    "net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "This is go image test!Welcome to see this page!!")
}

func main() {
    http.HandleFunc("/", handler)
    http.ListenAndServe(":8080", nil)
}
  1. 将该文件保存为main.go,并将其与Dockerfile放在同一个目录下,使用go build编译成二进制文件。
go build -o main .

查看当前目录下的文件

[root@xia go]# ls
Dockerfile  main  main.go
  1. 在终端中导航到该目录,并使用以下命令构建镜像:
docker build -t my-go-app:1.0 .
[root@xia go]# docker build -t my-go-app:1.0 .
[+] Building 20.8s (8/8) FINISHED                                                 
 => [internal] load build definition from Dockerfile                         0.0s
 => => transferring dockerfile: 302B                                         0.0s
 => [internal] load .dockerignore                                            0.0s
 => => transferring context: 2B                                              0.0s
 => [internal] load metadata for docker.io/library/golang:latest            20.6s
 => [1/3] FROM docker.io/library/golang@sha256:403f48633fb5ebd49f9a2b6ad671  0.0s
 => [internal] load build context                                            0.1s
 => => transferring context: 6.67MB                                          0.1s
 => CACHED [2/3] WORKDIR /go                                                 0.0s
 => [3/3] COPY . /go                                                         0.1s
 => exporting to image                                                       0.0s
 => => exporting layers                                                      0.0s
 => => writing image sha256:65154ad545a717ea49fec81d5e6f4b785b38eb5c1b63d73  0.0s
 => => naming to docker.io/library/my-go-app:1.0   
  1. 运行以下命令启动容器:
docker run -d -p 7777:8080 --name go-web my-go-app:1.0
  1. 访问浏览器
    在这里插入图片描述

制作一个编译安装的nginx镜像

  1. 准备一个编译安装的nginx脚本
#!/bin/bash
yum -y install wget zlib zlib-devel openssl openssl-devel pcre pcre-devel gcc gcc-c++ autoconf automake make 
#download nginx
mkdir -p /nginx
cd /nginx
#解压 下载的nginx的源码包
wget http://nginx.org/download/nginx-1.23.4.tar.gz
tar xf nginx-1.23.4.tar.gz
cd  nginx-1.23.4
#生成编译前配置工作-->Makefile,指定存放nginx1文件路径
./configure --prefix=/usr/local/nginx1  --with-threads --with-http_ssl_module --with-http_stub_status_module --with-stream
#编译
make
#编译安装--》将编译好的二进制程序安装指定目录/usr/local/nginx1
make   install
  1. 编写Dockerfile文件
[root@xia nginx]# cat Dockerfile 
#指定基础镜像
FROM centos:7
#设置环境变量
ENV NGINX_VERSION 1.24.2
ENV AUTHOR shengxia
#指定工作目录
WORKDIR /sc
#复制文件到目录
COPY . /sc
#安装网络软件和执行脚本
RUN yum install vim net-tools iputils iproute -y \
&& bash install_nginx.sh 
#暴露端口
EXPOSE 800
#设置nginx环境变量
ENV PATH=/usr/local/nginx1/sbin:$PATH
#指定退出信号
STOPSIGNAL SIGQUIT
#启动容器时执行的命令
CMD ["nginx","-g","daemon off;"]
  1. 在当前目录构建镜像
[root@xia nginx]# docker build -t my-nginx:1.24.2 .
[+] Building 0.1s (10/10) FINISHED                                                
 => [internal] load build definition from Dockerfile                         0.0s
 => => transferring dockerfile: 368B                                         0.0s
 => [internal] load .dockerignore                                            0.0s
 => => transferring context: 2B                                              0.0s
 => [internal] load metadata for docker.io/library/centos:7                  0.0s
 => [1/5] FROM docker.io/library/centos:7                                    0.0s
 => [internal] load build context                                            0.0s
 => => transferring context: 98B                                             0.0s
 => CACHED [2/5] WORKDIR /sc                                                 0.0s
 => CACHED [3/5] COPY . /sc                                                  0.0s
 => CACHED [4/5] RUN yum install vim net-tools iputils iproute -y && bash i  0.0s
 => CACHED [5/5] COPY nginx.conf /usr/local/nginx1/conf                      0.0s
 => exporting to image                                                       0.0s
 => => exporting layers                                                      0.0s
 => => writing image sha256:f7b666e208a865a53fb782417914778c3b6e46a31d77a65  0.0s
 => => naming to docker.io/library/my-nginx:1.24.2   
  1. 使用镜像
    这里映射到800端口是我将nginx的配置文件修改了一下
[root@xia nginx]# docker run -d -p 7799:800 --name my-nginx-1 my-nginx:1.24.2
  1. 浏览器访问
  2. 使用卷修改网页内容
#新建一个卷和index.html文件,修改内容
[root@xia nginx]# docker volume create nginx_web
[root@xia nginx]# docker run -d -p 8899:800 -v nginx_web:/usr/local/nginx1/html --name my-nginx-2 my-nginx:1.24.2
  1. 浏览器访问
    在这里插入图片描述
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值