合并整理(一)Docker常用命令

Docker

Docker包括三个基本概念:镜像(Image)、容器(Container)、仓库(Repository)

Docker hello world

  • 输出Hello world
docker run ubuntu:15.10 /bin/echo "Hello world"
  • 交互式对话能力
docker run -i -t ubuntu:15.10 /bin/bash
  • 启动容器(后台模式)
docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
  • 查看容器内的标准输出
docker logs <容器ID/NAMES>
  • 停止容器
docker stop <容器ID/NAMES>

Docker 容器使用

  • 获取镜像
docker pull ubuntu
  • 启动容器
docker run -it ubuntu /bin/bash
  • 查看正在运行的容器
docker ps
  • 查看所有容器
docker ps -a
  • 启动一个已停止的容器
docker start <容器ID/NAMES>
  • 后台运行
docker run -itd --name ubuntu-test ubuntu /bin/bash
  • 停止容器
docker stop <容器ID/NAMES>
  • 重启停止的容器
docker restart <容器ID/NAMES>
  • 进入容器的两种方式
docker attach <容器ID/NAMES>                # 退出,容器会停止
docker exec -it <容器ID/NAMES> /bin/bash    # 退出,容器不会停止
  • 导出容器
docker export <容器ID/NAMES> > ubuntu.tar
  • 导入容器
cat docker/ubuntu.tar | docker import - test/ubuntu:v1
  • 通过指定URL或者某个目录来导入
docker import http://example.com/exampleimage.tgz example/imagerepo
  • 删除容器
docker rm -f <容器ID/NAMES>

删除容器时,容器必须是停止状态,否则会报错

  • 清理掉所有处于终止状态的容器
docker container prune

运行一个 web 应用

  • 运行 WEB 应用
docker pull training/webapp  # 载入镜像
docker run -d -P training/webapp python app.py

-d:让容器在后台运行

-P:将容器内部使用的网络端口随机映射到我们使用的主机上

  • 通过 -p 参数来设置不一样的端口
docker run -d -p 45154:5000 training/webapp python app.py

Docker 内部端口 5000 映射到主机端口 45154

Docker 开放了 5000 端口(默认 Python Flask 端口)映射到主机端口 32769 上

  • 查看容器端口映射
docker port <容器ID/NAMES>
  • 查看 WEB 应用程序日志
docker logs -f <容器ID/NAMES>
  • 查看 WEB 应用程序容器的进程
docker top <容器ID/NAMES>
  • 检查 WEB 应用程序(底层信息)
docker inspect <容器ID/NAMES>

会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息

  • 查询最后一次创建的容器
docker ps -l

Docker 镜像使用

当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载

管理镜像

  • 列出本地主机上的镜像
docker images
  • 获取一个新的镜像
docker pull ubuntu:13.10
  • 查找镜像
docker search httpd
  • 使用这个镜像
docker run httpd
  • 删除镜像
docker rmi httpd

创建镜像

当我们从 docker 镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改:

1、从已经创建的容器中更新镜像,并且提交这个镜像

2、使用 Dockerfile 指令来创建一个新的镜像

更新镜像
  • 更新镜像之前,我们需要使用镜像来创建一个容器
docker run -t -i ubuntu:15.10 /bin/bash
  • 提交容器副本
docker commit -m="has update" -a="runoob" <容器ID/NAMES> runoob/ubuntu:v2
  • 使用新镜像 runoob/ubuntu 启动一个容器
docker run -t -i runoob/ubuntu:v2 /bin/bash
构建镜像
  • 创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像
FROM    centos:6.7
MAINTAINER      Fisher "fisher@sudops.com"

RUN     /bin/echo 'root:123456' |chpasswd
RUN     useradd runoob
RUN     /bin/echo 'runoob:123456' |chpasswd
RUN     /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE  22
EXPOSE  80
CMD     /usr/sbin/sshd -D
  • 使用 Dockerfile 文件,通过 docker build 命令来构建一个镜像
docker build -t runoob/centos:6.7 .
  • 使用新的镜像来创建容器
docker run -t -i runoob/centos:6.7 /bin/bash
  • 为镜像添加一个新的标签
docker tag <镜像ID> runoob/centos:dev

Docker 容器连接

  • 网络端口映射
docker run -d -P training/webapp python app.py
docker run -d -p 5000:5000 training/webapp python app.py

-P:是容器内部端口随机映射到主机的高端口

-p: 是容器内部端口绑定到指定的主机端口

  • 指定容器绑定的网络地址
docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py
  • 默认都是绑定 tcp 端口,如果要绑定 UDP 端口,可以在端口后面加上 /udp
docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py

容器互联

docker 有一个连接系统允许将多个容器连接在一起,共享连接信息

docker 连接会创建一个父子关系,其中父容器可以看到子容器的信息

  • 容器命名

创建一个容器的时候,docker会自动对它进行命名

另外,我们也可以使用 --name 标识来命名容器

docker run -d -P --name runoob training/webapp python app.py
  • 新建网络
docker network create -d bridge test-net    # 创建一个新的 Docker 网络
  • 查看 docker 网络
docker network ls
  • 连接容器

运行一个容器并连接到新建的 test-net 网络:

docker run -itd --name test1 --network test-net ubuntu /bin/bash

打开新的终端,再运行一个容器并加入到 test-net 网络:

docker run -itd --name test2 --network test-net ubuntu /bin/bash

在 test1 容器输入以下命令

docker exec -it test1 /bin/bash
ping test2

在 test2 容器输入以下命令

docker exec -it test2 /bin/bash
ping test1

配置 DNS

  • 查看容器的 DNS 是否生效
docker run -it --rm  ubuntu  cat etc/resolv.conf
  • 手动指定容器的配置
docker run -it --rm -h host_ubuntu  --dns=114.114.114.114 --dns-search=test.com ubuntu

Docker 仓库管理

  • 登录 docker hub
docker login
  • 退出 docker hub
docker logout
  • 检索镜像
docker search ubuntu
  • 拉取镜像
docker pull ubuntu
  • 推送镜像
docker push username/ubuntu:18.04

Docker Dockerfile

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

  • Dockerfile文件
FROM nginx
RUN echo '这是一个本地构建的nginx镜像' > /usr/share/nginx/html/index.html
  • 开始构建镜像
docker build -t nginx:v3 .
  • 上下文路径

上下文路径,是指 docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包

常用指令

常用指令link

  • FROM

定制的镜像都是基于 FROM 的镜像

  • RUN

用于执行后面跟着的命令行命令

  • COPY

复制指令,从上下文目录中复制文件或者目录到容器里指定路径

  • ADD

会自动复制并解压到 <目标路径>,在不解压的前提下,无法复制 tar 压缩文件

相比 ADD,推荐使用 COPY

  • CMD

类似于 RUN 指令,用于运行程序

CMD 在 docker run 时运行

RUN 在 docker build 时运行

  • ENTRYPOINT

类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖

  • ENV

设置环境变量

  • ARG

ARG 设置的环境变量仅对 Dockerfile 内有效

  • VOLUME

定义匿名数据卷,避免数据丢失和容器变大

  • EXPOSE

仅仅只是声明端口,方便配置映射

  • WORKDIR

指定工作目录

  • USER

用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户(用户和用户组必须提前已经存在)

  • HEALTHCHECK

用于指定某个程序或者指令来监控 docker 容器服务的运行状态

  • ONBUILD

用于延迟构建命令的执行

  • LABEL

以键值对的形式给镜像添加一些元数据(metadata)

Docker Compose

用于定义和运行多容器 Docker 应用程序的工具,从 YML 文件配置中创建并启动所有服务

  • app.py
import time

import redis
from flask import Flask

app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)


def get_hit_count():
    retries = 5
    while True:
        try:
            return cache.incr('hits')
        except redis.exceptions.ConnectionError as exc:
            if retries == 0:
                raise exc
            retries -= 1
            time.sleep(0.5)


@app.route('/')
def hello():
    count = get_hit_count()
    return 'Hello World! I have been seen {} times.\n'.format(count)
  • requirements.txt
flask
redis
  • Dockerfile
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP app.py
ENV FLASK_RUN_HOST 0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY . .
CMD ["flask", "run"]
  • docker-compose.yml
# yaml 配置
version: '3'
services:
  web:
    build: .
    ports:
     - "5000:5000"
  redis:
    image: "redis:alpine"
  • 使用 Compose 命令构建和运行应用

启动

docker-compose up

后台启动

docker-compose up -d
  • yml 配置指令

yml 配置指令link

Docker Machine

一种可以在虚拟主机上安装 Docker 的工具,并可以使用 docker-machine 命令来管理主机,也可以集中管理所有的 docker 主机

Swarm 集群管理

它将 Docker 主机池转变为单个虚拟 Docker 主机。 Docker Swarm 提供了标准的 Docker API,所有任何已经与 Docker 守护程序通信的工具都可以使用 Swarm 轻松地扩展到多个主机

项目记录

  • Dockerfile
FROM python:3.9.6
ADD ./src /usr/src/app/code
WORKDIR /usr/src/app/code
RUN pip install -r requirements.txt
CMD ["python", "/usr/src/app/code/app.py"]
  • 构建镜像
docker build -t my_image .
  • 启动容器
docker run -it -p 49153:5000 --name mic my_image

docker run -it -p 49153:5000 --name mic my_image /bin/bash

也可以进入容器

docker exec -it mic /bin/bash
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值