docker入門1-docker container

image和container介紹

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

一個container是image在內存中的運行實例,一個image能夠產生多個container實例。python

docker container命令

查看docker版本

# docker --version
Docker version 18.09.2, build 6247962

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

查看docker狀態

docker infodocker

測試docker安裝

docker run hello-world測試運行hello-world image.flask

docker image lsdocker images列出全部已下載的image.bash

docker container ls --all列出全部container.網絡

構建docker app

app.dockerfileapp

# 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 .socket

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

容器內的工做目錄是/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

相關文章
相關標籤/搜索