安装Docker(Linux)
运行以下命令安装docker
sudo apt update sudo apt install apt-transport-https ca-certificates curl software-properties-common curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add - sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" sudo apt install docker-ce
查看是否安装成功:
docker --version
运行Hello World
为了测试Docker是否能正常使用,我们先拉取(pull)一个hello-world镜像运行。
输入命令:
docker run hello-world
若Docker安装成功,则会输出下图所示信息。
从输出信息可以了解到,Docker未能在本地找到hello-world镜像后,在Docker Hub中拉取(pull)了hello-world的最新镜像,并创建了容器,在容器中运行程序,产生输出。
部署一个简单的Python应用
第一步:创建一个自定义的镜像
在本地建立一个命名为“Dockerfile.txt”的文件。输入如下命令。
# Use an official Python runtime as a parent image FROM python:3.7-alpine # Set the working directory to /app WORKDIR /app # Copy the current directory contents into the container at /app ADD . /app # Install any needed packages specified in requirements.txt RUN pip install -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"]
第二步:建立应用程序文件app.py和文本文件requirements.txt
app.py文件、requirements.txt文件应该与Dockerfile.txt文件放在同一个文件夹下。
以下是app.py这个python源代码文件的内容
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)
上述代码输出环境变量NAME,并通过调用socket.gethostname()获取当前主机的hostname。
以下是 requirements.txt 这个文件的内容
Flask Redis
Flask 和 Redis 都是在requirements.txt 文件中指定的python的包,docker会按照requirements.txt中的内容下载必要的python包。
理解Dokerfile文件
•FROM命令指定了基础镜像。 •WORKDIR命令配置了工作目录。 •ADD命令会将app.py拷贝到容器中。 •RUN pip install -r requirements.txt命令导入了Python的Flask和Redis标准库。 •EXPOSE命令指定容器需要映射到宿主机器的端口。 •ENV命令用于设置环境变量。 •CMD用于container启动时指定的操作。该操作可以是执行自定义脚本,也可以是执行系统命令。 该指令只能在文件中存在一次,如果有多个,则只执行最后一条。
第三步:构建应用
输入如下命令:
docker build -t docker-whale -f ./Dockerfile.txt .
注意在上述命令行的最后,有一个英文句点,不要遗漏。
其中,-t指定了生成镜像的仓库名,-f指定Dockerfile文本文件。
通过 docker image ls 命令可以查看本地的所有镜像。可以看到刚刚创建的自定义镜像docker-whale。
第四步:运行应用
注意:如果在阿里云ECS上安装部署这个docker应用,在自己的个人电脑上使用浏览器访问这个docker应用的话,还需要去ECS的安全配置中打开4000端口方能访问,否则无法看到下述效果。
1) 启动容器实例运行应用
输入如下命令:
docker run -p 4000:80 docker-whale
其中,-p将容器的端口号80映射到宿主机器的端口号4000,从而使得app.py的程序输出可以通过HTTP协议输出到浏览器。
2) 访问容器实例,查看运行结果
在浏览器中输入URL:http://a.b.c.d:4000 即可看到应用的输出结果。其中a.b.c.d是部署了docker应用的主机ip地址。
注意:如果在阿里云ECS主机上部署并启动容器实例,可以开启第二个终端窗口连接阿里云ECS主机。
随后在命令行执行:
curl localhost:4000
即可看到类似如下的输出:
<h3>Hello World!</h3><b>Hostname:</b> dbc3d903eca0<br/> <b>Visits:</b> <i>cannot connect to Redis, counter d
部署c++应用
将C/C++代码运行在容器内的最简方法,就是将编译指令写入Dockerfile 中,然后使用此Dockerfile构建自定义镜像,最后直接运行此镜像,即可启动程序。
FROM gcc:4.9 # Set the working directory to /myapp WORKDIR /myapp # Copy the current directory contents into the container at /myapp ADD . /myapp # Make port 80 available to the world outside this container EXPOSE 80 RUN gcc -o myapp main.c # Run app.py when the container launches CMD ["./myapp"]
编辑main.c,内容如下:
#include<stdio.h> int main() { printf("Hello World\n"); return 0; }
现在,就可以使用Dockerfile来构建镜像my-gcc-app:
docker build -t gcc-image . -f Dockerfile.txt
创建并运行此容器,会编译并运行程序,输出Hello World语句。
docker run -it --rm --name gcc-container gcc-image
Hello World