docker镜像
docker镜像是一个轻量级、可移植的打包文件,包含了运行应用程序所需的所有代码、库、依赖项和配置信息。通过使用docker镜像,可以快速地部署和运行应用程序,而无需担心环境差异、依赖项问题等。
制作Docker镜像需要以下文件:
Dockerfile
:Dockerfile是一个文本文件,包含了构建docker镜像的指令和命令。在Dockerfile中,可以指定镜像的基础操作系统、安装软件包、配置环境变量、设置工作目录等。应用程序代码
:将应用程序代码放入Docker镜像中,可以使镜像更加完整和独立,避免依赖于外部文件和环境。依赖项
:如果应用程序需要依赖其他软件包或库,需要将这些依赖项打包到Docker镜像中。配置文件
:应用程序的配置文件也应该包含在Docker镜像中,方便在不同环境中部署和运行。
Dockerfile命令
FROM
:指定基础镜像,即构建新镜像所需要的基础镜像。 例子:
FROM centos
RUN
:在镜像中执行命令,用于安装软件包、运行编译器、创建文件等操作。例子:
RUN yum install -y nginx && mkdir /hello
COPY
:将本地文件复制到容器中。 例子:
COPY index.html /usr/share/nginx/html/
ADD
:和 COPY 类似,但可以自动解压缩压缩文件。 例子:
ADD myapp.tar.gz /opt/
WORKDIR
:设置工作目录。 例子:
WORKDIR /usr/share/nginx/html/
EXPOSE
:声明容器需要监听哪些端口。 例子:
EXPOSE 80
CMD
:指定容器启动时需要运行的命令。 例子:
CMD ["nginx", "-g", "daemon off;"]
ENTRYPOINT
:指定容器启动时需要运行的命令,并可以接受命令行参数。 例子:
ENTRYPOINT ["echo", "Hello"]
CMD ["world"]
当ENTRYPOINT和CMD都存在的时候,CMD里的内容会成为ENTRYPOINT里的参数(位置参数)
ENV
:设置环境变量,格式为ENV key value。例子:
ENV LANG en_US.UTF-8
ARG
:定义构建时的参数,格式为ARG name=value。例子:
ARG VERSION=1.0
VOLUME
:指定容器中的目录为挂载点。例子:
VOLUME /data
docker镜像示例
制作一个简单的python镜像
-
安装Docker:安装docker,如果没有安装docker,可以看这篇博客docker安装启动。
-
选择Python版本:选择使用Python 3.9版本。
-
创建Dockerfile:在项目根目录下创建一个名为Dockerfile的文件,并在其中编写以下代码:
# 基础镜像
FROM python:3.9
# 设置工作目录
WORKDIR /app
# 将当前目录下的所有文件拷贝到工作目录下
COPY . /app
# 安装依赖包
RUN pip install -r requirements.txt
# 暴露端口
EXPOSE 5000
# 启动命令
CMD ["python", "app.py"]
- 编写应用程序:在项目根目录下创建一个名为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')
- 编写requirements.txt:在项目根目录下创建一个名为requirements.txt的文件,并在其中列出应用程序所需的Python依赖项,我们只需要Flask:
Flask==2.0.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
- 运行容器:运行以下命令来启动容器:
docker run -d -p 5000:5000 --name my-python-1 my-python-app
- 浏览器访问
制作一个简单的go镜像
-
创建一个新的目录,用于存储我们的Dockerfile和其他相关文件,在该目录下,创建一个名为Dockerfile的文件,并在其中添加以下内容。
-
设置基础镜像
FROM golang:latest
- 将工作目录设置为/go
WORKDIR /go
- 将当前目录中的所有文件复制到容器的/app目录下
COPY . /go
- 暴露端口
EXPOSE 8080
- 容器启动时运行的命令
CMD ["/go/main"]
- 编写一个简单的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)
}
- 将该文件保存为main.go,并将其与Dockerfile放在同一个目录下,使用
go build
编译成二进制文件。
go build -o main .
查看当前目录下的文件
[root@xia go]# ls
Dockerfile main main.go
- 在终端中导航到该目录,并使用以下命令构建镜像:
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
- 运行以下命令启动容器:
docker run -d -p 7777:8080 --name go-web my-go-app:1.0
- 访问浏览器
制作一个编译安装的nginx镜像
- 准备一个编译安装的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
- 编写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;"]
- 在当前目录构建镜像
[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
- 使用镜像
这里映射到800端口是我将nginx的配置文件修改了一下
[root@xia nginx]# docker run -d -p 7799:800 --name my-nginx-1 my-nginx:1.24.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
- 浏览器访问