Docker使用
2019-02-26 本文已影响20人
霡霂976447044
本文基于Linux Mint19操作系统环境。
1. 配置
apt失败则下载deb文件安装,下载deb文件 根据官方教程, https://docs.docker.com/get-started/#test-docker-installation
安装好之后,添加docker组。
sudo groupadd docker
sudo usermod -aG docker $USER
2. docker镜像
2.1加速镜像
使用国内镜像比较快, Ubuntu
sudo vim /etc/docker/daemon.json
输入如下
{
"registry-mirrors": [
"https://registry.docker-cn.com"
]
}
2.2 镜像操作
- 获取
docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
docker pull ubuntu:16.06
- 列出本地镜像
docker images # docker image ls 等同
- 运行为容器并且结束后删除容器
docker run -it --rm ubuntu:16.04 bash # bash表示运行的容器命令
docker run --name webserver -d -p 80:80 nginx # -p 指定端口 后台运行 结束不删除
docker run -it -p 5000:5000 --rm 2b7
docker run -it --mount type=bind,source=/home/alonebo,target=/home/alonebo ubuntu:16.04 bash
- 删除镜像
docker image rm [选项] <镜像/镜像ID/摘要等> [<镜像2> ...]
docker image rm ubuntu:16.04
2.3 Dockerfile创建镜像
Demo: 创建nginx的镜像
# 编写Dockerfile
mkdir mynginx
cd mynginx
touch Dockerfile
vi Dockerfile # 写入下面两行到文件
FROM nginx
run echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
# 构建为镜像
docker build -t nginx:v3 .
Dockerfile参数:
-
CMD 容器启动参数 CMD [ "sh", "-c", "echo $HOME" ]
-
WORKDIR 指定工作目录
-
ENTRYPOINT 入口点 指定了ENTRYPOINT后可以在启动时传递参数
另一个Dockerfile Demo
# <ENTRYPOINT> "<CMD>"
# Dockerfile
FROM ubuntu:16.04
RUN apt-get update \
&& apt-get install -y curl \
&& rm -rf /var/lib/apt/lists/*
ENTRYPOINT [ "curl", "-s", "http://ip.cn" ]
Run:
$ docker run myip -i #给curl添加 -i参数
3. docker容器操作
3.1 启动镜像为容器
docker run ubuntu:16.04 /bin/echo 'hello docker' # > hello docker
docker run -it ubuntu:16.04 /bin/bash # > root@xxx:/#...
3.2 以镜像来后台运行容器(程序执行完 容器也跟着停止)
docker run -d ubuntu:16.04 /bin/echo 'hello docker' # > nothing
3.3 显示所有容器状态
docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ef6e2bcd8355 ubuntu:16.04 "/bin/echo 'hello do…" 53 seconds ago Exited (0) 52 seconds ago compassionate_ramanujan
3.5 启动一个容器 如何启动取决于一开始镜像如何启动
docker container start [OPTIONS] CONTAINER [CONTAINER...]
docker container start 容器ID
3.6 停止容器
docker container stop CONTAINER_ID
进入容器
docker exec -it 69d1 bash
删除容器
docker container rm CONTAINER
docker container prune
4. Docker-Compose
定义和运行多个 Docker 容器的应用
4.1 安装
curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
4.2 Demo
app.py
from flask import Flask
from redis import Redis
app = Flask(__name__)
redis = Redis(host='redis', port=6379)
@app.route('/')
def hello():
count = redis.incr('hits')
return 'Hello World! 该页面已被访问 {} 次。\n'.format(count)
if __name__ == "__main__":
app.run(host="0.0.0.0", debug=True)
Dockerfile
FROM python:3.6-alpine
ADD . /code
WORKDIR /code
RUN pip install redis flask
CMD ["python", "app.py"]
docker-compose.yml tab要为空格键
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
4.5 运行
docker-compose up
4.6 配置文件参数
ports 使用宿主端口:容器端口(HOST:CONTAINER)格式,或者仅仅指定容器的端口(宿主将会随机选择端口)都可以。
ports:
- "3000"
- "8000:8000"
- "49100:22"
- "127.0.0.1: 8001:8001"
volumes 数据卷所挂载路径设置
volumes:
- /var/lib/mysql
- cache/:/tmp/cache
- ~/configs:/etc/configs/:ro
设置主机的cache目录到容器的/tmp/cache目录
environment 设置环境变量。你可以使用数组或字典两种格式
postgres:
image: postgres:10.3
environment:
POSTGRES_USER: blog
POSTGRES_PASSWORD: blog
POSTGRES_DB: blog
ports:
- "3306"
depends_on 解决容器的依赖、启动先后的问题。以下例子中会先启动redisdb再启动web
version: '3'
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
可能会遇到的错误
服务器部署安装Docker出现libltdl.so.7缺失
docker: error while loading shared libraries: libltdl.so.7:
解决:
sudo apt-get install -y libltdl7