docker基本使用

一、docker介绍


(一)、简述

Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。

(二)、使用场景

web应用的自动化打包和发布;
自动化测试和持续集成、发布;
在服务型环境中部署和调整数据库或其他的后台应用;
从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境。

(三)、优点

灵活
轻量级: 共享主机内核
便携式: 各个环境可运行
可扩展: 多副本
可堆叠: 垂直和即时堆叠服务

(四)、三个基本概念

  1. image镜像
docker镜像是创建容器的一个模板,比如:一个完整的centos系统。docker提供了简单的文件管理创建镜像或者下载官网已有的镜像。
  1. container容器
容器是独立运行的一个或者一组应用。它可以被启动,开始、停止、删除,各个容器相互隔离,保证了应用的安全。
  1. repostory仓库
仓库是存储镜像文件的。仓库可以有多个镜像,每个镜像可以有多个tag。
仓库分为两类:公有仓库(如:dockerhub)、私有仓库(如:harbor)

二、docker环境安装


(一)、下载安装包

wget https://download.docker.com/linux/static/stable/x86_64/docker-19.03.11.tgz

(二)、解压

# 解压到/tmp目录
tar -zxvf docker-19.03.11.tgz -C /tmp
# 移动到/usr/bin目录
mv /tmp/docker/* /usr/bin

(三)、systemd配置

  1. 创建docker.service文件
vi  /usr/lib/systemd/system/docker.service
  1. 配置文件内容
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service containerd.service
Wants=network-online.target
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process
[Install]
WantedBy=multi-user.target

(四)、daemon.json配置

  1. 创建daemon.json文件
vi /etc/docker/daemon.json
  1. 配置文件内容
{
  "insecure-registries": ["x.x.x.x","xxx.com"],
  "storage-driver": "overlay2",
  "bip": "192.168.0.1/24",
  "graph": "/data/docker",
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m",
    "max-file": "3"
  }
}
  1. 参数说明
insecure-registries: http私有仓库地址配置
storage-driver: 存储驱动overlay2
bip: 指定网络桥接ip
graph: docker存储地址
log-driver: 日志驱动
log-opts: 日志参数选项

(五)、hosts配置

  1. 编辑hosts文件
vi /etc/hosts
  1. 新增配置
# 私有镜像仓库(如:harbor)的ip和域名
x.x.x.x	xxx.com

(六)、启动服务

  1. 启动服务
systemctl start docker
  1. 开机自启动
systemctl enable docker

(七)、授权普通用户

  1. 创建用户组
groupadd docker
  1. 授权普通用户
gpasswd -a user01 docker
  1. 重启服务
systemctl restart docker

三、docker基本命令使用


(一)、管理命令

builder     Manage builds
config      Manage Docker configs
container   Manage containers
context     Manage contexts
engine      Manage the docker engine
image       Manage images
network     Manage networks
node        Manage Swarm nodes
plugin      Manage plugins
secret      Manage Docker secrets
service     Manage services
stack       Manage Docker stacks
swarm       Manage Swarm
system      Manage Docker
trust       Manage trust on Docker images
volume      Manage volumes

(二)、操作命令

build       Build an image from a Dockerfile
cp          Copy files/folders between a container and the local filesystem
exec        Run a command in a running container
images      List images
info        Display system-wide information
inspect     Return low-level information on Docker objects
load        Load an image from a tar archive or STDIN
login       Log in to a Docker registry
logs        Fetch the logs of a container
ps          List containers
pull        Pull an image or a repository from a registry
push        Push an image or a repository to a registry
restart     Restart one or more containers
rm          Remove one or more containers
rmi         Remove one or more images
save        Save one or more images to a tar archive (streamed to STDOUT by default)
start       Start one or more stopped containers
stats       Display a live stream of container(s) resource usage statistics
stop        Stop one or more running containers
tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
top         Display the running processes of a container

(三)、常用命令使用

  1. 基本使用
# 列出所有镜像 (-q 只显示镜像id)
docker imaegs -a -q
# 列出所有容器信息(-q 只显示容器id)
docker ps -a -q
# 进入某一个容器
docker exec -it 容器id /bin/bash
# 查看某一个容器日志
docker logs -f --tail 20 容器id
# 拉取镜像
docker pull 镜像名:tag
# 推送镜像
docker push 镜像名:tag
# 重启容器
docker restart 容器id
# 停止容器
docker stop 容器id
# 启动镜像
docker start 容器id
  1. 管理使用
# 查询容器详细信息
docker inspect 容器id
# 删除所有未使用的镜像
docker rmi $(docker imaegs -a -q)
# 删除所有容器
docker rm -f $(docker ps -a -q)
# 清除未使用的images containers 等
docker system prune --volumes
# 查看容器使用情况
docker stats
# docker镜像打标签
docker tag 已有镜像名:已有tag 新镜像名:新tag
# 保存镜像
docker save 镜像名:tag -o image.tar
# 加载镜像
docker load -i image.tar
# 用于容器与主机之间的数据拷贝
docker cp 容器id:/home .
docker cp /etc/hosts 容器id:/etc/hosts
# 私有仓库登录
docker login 私有仓库地址 -u用户 -p密码
# 网络
docker network ls

四、dockerfile文件管理


(一)、简述

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

(二)、示例

FROM openjdk:8-jre
ENV LANG=C.UTF-8
RUN mkdir -p /usr/skywalking/agent/
# A streamlined jre
ADD jdk1.8.0_201/ /usr/java/jdk1.8.0_201/
ADD agent/ /usr/skywalking/agent/
# set env
ENV JAVA_HOME /usr/java/jdk1.8.0_201
ENV PATH ${PATH}:${JAVA_HOME}/bin
# run container with base path:/
WORKDIR /
CMD bash

(三)、文件指令说明

  1. 常用指令
# 基础镜像(如:jdk,nodejs等)
FROM <镜像>
(例如:FROM openjdk:8-jre)
# 设置环境变量(配置maven、jdk环境变量)
ENV <key>=<value> ...
(例如: ENV JAVA_HOME=/usr/java/jdk1.8.0_201 \
  PATH=$PATH:/usr/java/jdk1.8.0_201/bin)
# 命令行指令,shell和exec格式
RUN <命令行> 
(例如:RUN yum install -y wget)
RUN ["可执行文件", "参数1", "参数2"]
# 复制指令 ,从上下文目录中复制文件或者目录到容器里指定路径。
# 推荐使用
COPY [源路径:目标路径]
(例如:COPY jdk1.8.0_201/ /usr/java/jdk1.8.0_201/)
# 推荐使用
ENTRYPOINT ["<executeable>","<param1>","<param2>",...]
(例如: ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -jar /app.jar" ])
# 指定目录
WORKDIR <工作目录路径>
  1. 其他指令
# 标签(自定义标签,作者信息等)
LABEL  <key>=<value> ...
(例如: LABEL version="1.0")
ADD [源路径:目标路径]
(例如:ADD jdk-8u201-linux-x64.tar.gz /usr/java/jdk1.8.0_201/)
# 类似于 RUN 指令,用于运行程序
# 注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。
CMD <shell 命令>
(例如: CMD bash)
# 声明端口,仅仅只是声明端口。
# 其他指令
HEALTHCHECK
ONBUILD
ARG

(四)、镜像构建方式

  1. 默认文件名
docker build -t 镜像名:tag .
  1. 自定义文件名
docker build -t 镜像名:tag -f dockerfile文件名 .

五、docker网络类型和驱动器

(一)、none

  1. 简述

    对于此容器,请禁用所有联网。通常与自定义网络驱动程序一起使用。none不适用于群体服务。

    使用none模式,容器拥有自己的network namespace,但是并不为容器进行任何的网络配置。没有网卡、路由、IP等信息。

    封闭的网络能很好的保证容器的安全性

(二)、bridge

  1. 简述

    默认的网络驱动程序。如果未指定驱动程序,则这是您正在创建的网络类型。当您的应用程序在需要通信的独立容器中运行时,通常会使用网桥网络。

(三)、host

  1. 简述

    直接使用主机的网络,不会虚拟出网卡和IP等信息。而是使用宿主机的IP和端口,但是容器的文件系统、进程列表等是与宿主机相互隔离。

  2. 优缺点

优点:
网络性能比较好
缺点:
需要特定端口,避免冲突
网络的隔离性较差

(四)、overlay

  1. 简述

    覆盖网络将多个Docker守护程序连接在一起,并使群集服务能够相互通信。您还可以使用覆盖网络来促进群集服务与独立容器之间或不同Docker守护程序上的两个独立容器之间的通信。

(五)、macvlan

  1. 简述

    macvlan网络允许您为容器分配MAC地址,使其在网络上显示为物理设备。Docker守护程序通过其MAC地址将流量路由到容器。macvlan在处理希望直接连接到物理网络而不是通过Docker主机的网络堆栈进行路由的旧应用程序时,使用驱动程序有时是最佳选择。

六、docker数据管理

(一)、volumes

  1. 简述

    volumes数据卷存储在主机文件系统的一部分中,该文件系统由Docker管理(/var/lib/docker/volumes/在Linux上)。非Docker进程不应修改文件系统的这一部分。卷是在Docker中持久保存数据的最佳方法。

  2. 使用示例

# -v 方式
docker run -d \
  --name devtest \
  -v myvol2:/app \
  nginx:latest
# --mount方式
docker run -d \
  --name devtest \
  --mount type=volume source=myvol2,target=/app \
  nginx:latest

(二)、bind mounts

  1. 简述

    自Docker早期以来可用。与卷相比,绑定安装的功能有限。使用绑定安装时,主机上的文件或目录将安装到容器中。文件或目录由主机上的完整路径引用。该文件或目录不需要在Docker主机上已经存在。如果尚不存在,则按需创建。绑定挂载性能非常好,但是它们依赖于具有特定目录结构可用的主机文件系统。如果要开发新的Docker应用程序,请考虑使用命名卷。您不能使用Docker CLI命令直接管理绑定安装。

  2. 使用示例

# -v 方式
docker run -d \
 -it \
 --name devtest \
 -v "$(pwd)"/target:/app \
 nginx:latest
 
# --mount 方式
docker run -d \
 -it \
 --name devtest \
 --mount type=bind,source="$(pwd)"/target,target=/app \
 nginx:latest

(三)、tmpfs mounts

  1. 简述

    tmpfs挂载不会持久化在磁盘上,无论是在Docker主机上还是容器内。容器在其生存期内可以使用它来存储非持久状态或敏感信息。

  2. 使用示例

# --mount方式
docker run -d \
 -it \
 --name tmptest \
 --mount type=tmpfs,destination=/app \
 nginx:latest
 
# --tmpfs 方式
docker run -d \
 -it \
 --name tmptest \
 --tmpfs /app \
 nginx:latest
posted @ 2020-12-31 11:34  qms19  阅读(138)  评论(0编辑  收藏  举报