概念:
docker镜像:每一个镜像可以依赖于一个或多个镜像组成另一个镜像,AUFS文件系统
docker仓库:集中存放镜像的仓库
docker容器:镜像运行后的进程,镜像与容器之间的关系类似于类与实例
docker命令
docker version 查看docker版本信息
docker info 查看docker配置信息
镜像管理
docker images 查看所有镜像
docker search nginx 搜索镜像
docker pull nginx:1.17.9 拉取镜像
docker save nginx > nginx.tar 导出
docker load <nginx.tar 导入
docker rmi nginx:1.17.9 删除
docker tag nginx:1.17.9:maidou_nginx:1.17.9 更改镜像名称
docker history nginx 查看镜像创建历史
容器管理
docker run -d --name=nginx nginx:1.17.9 运行容器
docker ps 查看运行的容器,只正常运行的
docker ps -a 查看所有容器,包括异常退出的等
docker top nginx 查看容器中运行进程
docker stats nginx 查看资源占用
docker start/restart/stop/kill nginx 启动、重启、停止、杀掉容器
docker pause/unpause nginx 暂停与取消暂停
docker rm -f nginx 强制删除
docker exec -it nginx ls 执行命令
dcoker logs -f nginx 查看容器日志
docker inspect nginx 查看容器/镜像源信息,不多用
docker diff nginx 查看容器内文件结构变化,不多用
docker cp hosts nginx:/tmp 本机文件复制到容器里
docker cp nginx:/data/html/1.sh 2.sh 反之亦然
docker搭建nginx:
docker run -d --name nginx -v $(pwd)/nginx/html:/usr/share/nginx/html -p 80:80 nginx 需要注意的事,nginx默认有个index.html,则$(pwd)/nginx/html目录下,需要自己建一个html
docker network
Docker network create $name 创建一个网络
Docker network ls 检查当前所有网络
需要理解的是容器之间想进行网络访问,需指定同一个docker network
docker搭建testlink
docker network create testlink 创建一个testlink网络
运行mariadb
docker run -d --name mariadb -e MARIADB_ROOT_PASSWORD=mariadb -e MARIADB_USER=bn_testlink -e MARIADB_PASSWORD=bn_testlink -e MARIADB_DATABASE=bitnami_testlink --net testlink -v $(pwd)/mariadb:/bitnami bitnami/mariadb:10.3.22
运行testlink,新版本testlink开放端口变成8080与8443,如果出现问题,可以试试老端口80与443
docker run -d -p 8080:8080 -p 8443:8443 --name testlink -e TESTLINK_DATABASE_USER=bn_testlink -e TESTLINK_DATABASE_PASSWORD=bn_testlink -e TESTLINK_DATABASE_NAME=bitnami_testlink --net testlink -v $(pwd)/testlink:/bitnami bitnami/testlink:1.9.20
默认用户名:user,默认密码:bitnami。
docker安装jenkins
docker run -d --name jenkins -v $(pwd)/jenkins:/var/jenkins_home -p 8082:8080 -p 50000:50000 jenkins/jenkins:latest
Docker-compose使用
一般用于定义和运行多容器的Docker应用程序的工具,通过compose,可以使用yaml文件来配置应用程序的服务
一般步骤:
1.Dockerfile定义应用程序环境
2.在docker-compose.yml中定义组成应用程序的服务,以便他们可以在隔离的环境中一起运行
3.运行docker-compose up,然后Compose启动并运行你的整个应用程序
简单目录结构:
demo
-.env
-app.py
-docker-compose.yml
-Dockerfile
.env配置
REDIS_VERSION=redis:alpine
app.py内容参考如下:
from flask import Flask
import redis
import time
app = Flask(__name__)
client = redis.StrictRedis(host='redis',port='6379')
def get_hit():
retries = 5
while True:
try:
return client.incr('count')
except redis.exceptions.ConnectionError as e:
if retries == 0: raise e
retries -= 1
time.sleep(0.5)
@app.route('/')
def index():
hit = get_hit()
return f'hello world,i hava seen {hit} times'
yml简单参考内容如下:
version: "3.0"
services:
web: #引用名称
build:
context: . #目录为当前目录
dockerfile: Dockerfile #dockerfile文件
depends_on:
- redis # 依赖redis
ports:
- "5007:5000" #端口映射
redis:
image: ${REDIS_VERSION} #在当前目录.env文件配置
restart: always
dockerfile参考下面dockerfile文件配置
常用命令:
docker-compose config #在yml所在文件查看解析后的配置
docker-compose up -d #后台启动,一般直接用这个在本机构建加启动
docker-compose build #构建镜像
docker-compose pull #下载镜像
docker-compose ps #检查运行的容器
docker-compose top #进程
docker-compose start/stop/restart #启动/停止/重启
Docker registry
# 假设服务器地址为139.xxx.xxx.xxx
服务器上启动registry:docker run -d -p 5000:5000 -v $(pwd)/registry:/var/lib/registry --restart always --name registry registry:2.7.1
镜像名称(标红部分固定写法,一定注意,我这搞了半个多小时才悟出来):139.xxx.xxx.xxx:5000/busybox_test:latest
linux服务器 在/etc/docker/daemon.json配置
我这边本机是mac,可以直接参照下图或vim ~/.docker/daemon.json 配置:
一般json文件加入如下内容即可:
{
"insecure-registries" : [
"139.xxx.xx.xxx:5000"
]
}
重命名镜像:
docker tag busybox:latest 139.xxx.xx.xxx:5000/busybox_test:latest #更改镜像名称
docker push 139.xxx.xx.xxx:5000/busybox_test:latest #上传到139.xxx.xx.xxx私人仓库
docker pull 139.xxx.xx.xxx:5000/busybox_test:latest #从139.xxx.xx.xxx私人仓库拉取
镜像命名方式:server/name:tag
dockerfile语法指令
# 基础镜像
FROM nginx:1.17.9
#标签
LABEL maintainer="hogwarts@ceshiren.com"
# 容器环境变量
ENV NGINX_VERSION=1.17.9
ENV AUTHOR=zhiyang
# 文件基础变量,本文件其它地方可饮用
ARG work_pwd=/data/html
# 登陆用户
USER root
# 安装一些依赖linux包
RUN apt-get -yq update && apt-get install -y curl && ln -sf /dev/stdout /var/log/nginx/access.log \
&& ln -sf /dev/stderr /var/log/nginx/error.log
# 挂载卷
VOLUME ["/data"]
# 工作目录
WORKDIR $work_pwd
# 构建容器时,本机当前目录的index.html复制到工作目录$work_pwd
COPY index.html .
# 启动nginx守护进程
CMD ["nginx","-g","daemon off;"]
STOPSIGNAL SIGRTMAX
#检查
HEALTHCHECK --interval=3600s --timeout=10s CMD curl -fs http://localhost/ || exit 1
docker构建镜像
docker build -f 指定文件
docker build -t 添加标签
docker build --no-cache 不使用缓存,拉取或安装东西都会重新安装,慢一点但不科学的事情少一点
docker build --build-arg #ARG指令变量,可取代dockerfile里的ARG变量
举例:
demo
-Dockerfile
-.dockerignore
-app.py
Dockerfile如下:
FROM python:3.7-alpine
LABEL maintainer="liuzhiyang"
ARG kdir=/tmp
WORKDIR $kdir
ENV FLASK_APP app.py
ENV FLASK_RUN_HOST 0.0.0.0
COPY . .
EXPOSE 5000
RUN pip install flask
STOPSIGNAL SIGTERM
CMD ["flask","run"]
.dockerignore如下:
Dockerfile*
app.py如下:
from flask import Flask
app=Flask(__name__)
@app.route('/')
def index():
return 'hello world'
运行命令:
docker build -t flask_web:1 -f Dockerfile . #demo目录下运行,构建镜像
docker run -d -p 5001:5000 flask_web:1 #随意