1. 程式人生 > >docker入門1-docker container

docker入門1-docker container

not fin 添加 return 當前 工作目錄 comm -c define

image和container介紹

一個image是一個可被docker執行的包,它包括程序運行的所有東西,包括代碼,運行時,庫,環境變量和配置文件。

一個container是image在內存中的運行實例,一個image可以產生多個container實例。

docker container命令

查看docker版本

# docker --version
Docker version 18.09.2, build 6247962

使用docker version(不帶--)會得到更詳細的版本信息.

查看docker狀態

docker info

測試docker安裝

docker run hello-world

測試運行hello-world image.

docker image lsdocker images列出所有已下載的image.

docker container ls --all列出所有container.

構建docker app

app.dockerfile

# use an official python runtime as a parent image
FROM python:2.7-slim
# set the working directory to /app
WORKDIR /app
# copy the current directory contents into the container at /app
COPY . /app
# install any needed packages specified in requirements.txt
RUN pip install --trusted-host pypi.python.org -r requirements.txt
# make port 8001 available to the world outside this container
EXPOSE 8001
# define enviornment veriable
ENV NAME World
# run app.py when the container launches
CMD ["python", "app.py"]

docker build -f ./app.dockerfile --tag=friendlyhello .

-f參數指定dockerfile的位置,--tag參數指定輸出的docker image名稱.
構建的image文件可能依賴於別的父image.

容器內的工作目錄是/app,這個文件還把當前構建目錄的所有文件COPY到了容器內的/app文件夾下。這裏還差兩個文件app.pyrequirements.txt。等下創建它們,它們也應該跟dockerfile在一起以便於等會COPY進容器。

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)

requirements.txt

Flask
Redis

運行docker app

docker run -p 8001:8001 friendlyhello

如果端口被占用,使用命令lsof -i tcp:8001查看本機8001端口被哪個應用占用.

後臺運行docker app

docker run -d -p 8001:8001 friendlyhello

-d指定容器以deamon方式運行,上述命令會返回一長串容器ID.
這裏將外部的8001端口映射到container中的8001端口,訪問http://localhost:8001/就能得到返回內容。如果啟動命令的端口部分改為-p 8080:8001,那就需要訪問http://localhost:8080/。container內中的服務,只監聽8001,只能通過修改代碼監聽的端口和dockerfile暴露出的端口。

查看container內的文件

對運行的docker,使用docker提供的exec命令docker exec <container ID> <Command>在容器內執行ls命令,就可以查看到container內的內容,當前這個image運行後的container中有app.dockerfile,app.pyrequirements.txt三個文件。

退出docker app

在前臺運行時,使用Ctrl + C即可結束進程.

也可以使用container的stop命令docker container stop <Container NAME or ID>.查看當前運行container的命令是docker container ls,要查看所有狀態的container,加-a參數.

給docker app添加tag

推薦添加tag的格式是docker tag image username/repository:tag.

示例:

docker tag friendlyhello cchenyang/get-started:part2

cchenyang是docker hub的username,之後的get-started:part2就是把image friendlyhello改名為get-started並將默認標記latest改為part2.這個標記習慣用法是設置為repository的版本號.

分享image

docker login登錄docker hub,將添加tag後的image push到docker hub中docker push cchenyang/get-started:part2

之後,就可以在任何有網絡並安裝docker的機器中使用docker run -p 8001:8001 cchenyang/get-started:part2獲得這個image並運行~!!

系列導航

docker入門2-docker service
docker入門3-docker swarm
docker入門4-docker stack

docker入門1-docker container