docker入門1-docker container
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
docker image ls
或docker 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.py
和requirements.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.py
和requirements.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