Docker常用命令

发布于 2020-5-7 2:07:34 字数 15811 阅读 398 分类 dockernodejs


 Docker 是什么


 Docker 概念


关于 Docker 的概念是确实不太好总结,下面我通过四点向你说明 Docker 到底是个什么东西。

  • Docker 是世界领先的软件容器平台。
  • Docker 使用 Google 公司推出的 Go 语言  进行开发实现,基于 Linux 内核 的cgroup,namespace,以及 AUFS 类的 UnionFS 等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进 程,因此也称其为容器。Docker 最初实现是基于 LXC.
  • Docker 能够自动执行重复性任务,例如搭建和配置开发环境,从而解放了开发人员以便他们专注在真正重要的事情上,构建杰出的软件。
  • 用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。

 Docker 的基本组成架构


看一张 Docker 架构图


  1. 左边大框框是我们进行 Docker 操作的宿主机,其运行了一个 Docker daemon 的核心守护程序,负责构建、运行和分发 Docker 容器。

  2. 在宿主机中安装了 Docker 客户端,其与 Docker daemon 守护进程进行通信,客户端会将 build、pull、run 等命令发送到  Docker daemon 守护进程进行执行。

  3. 右框框为 Docker 注册表存储 Docker 镜像,是一个所有 Docker 用户共享 Docker 镜像的服务,Docker daemon 守护进程与之进行交互。


基础:

一般来说,每个容器都应该做一件事,并且做好。几个原因:

  • 您很有可能必须以不同于数据库的方式扩展 API 和前端
  • 单独的容器让您可以隔离版本和更新版本
  • 虽然您可以在本地为数据库使用容器,但您可能希望在生产中为数据库使用托管服务。你不想在你的应用程序中发布你的数据库引擎。
  • 运行多个进程将需要一个进程管理器(容器只启动一个进程),这增加了容器启动/关闭的复杂性


 docker安装(debian)


1.安装通过HTTPS添加新存储库所需的软件包:
apt update
apt install apt-transport-https ca-certificates curl software-properties-common gnupg2

02、使用以下curl命令导入存储库的GPG密钥:
curl -fsSL https://download.docker.com/linux/debian/gpg |  apt-key add -

3.将稳定的Docker APT存储库添加到系统的软件存储库列表中:
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"

04、更新apt软件包列表并安装最新版本的Docker CE(Community Edition):
apt update
apt install docker-ce

05、安装完成后,Docker服务将自动启动。要验证它输入:
systemctl status docker

6. 查看当前docker版本
docker -v

 Docker Compose 安装 


在 Linux 上,您可以从GitHub 上Compose 存储库发布页面下载 Docker Compose 二进制文件 。按照链接中的说明进行操作,

1.运行此命令以下载 Docker Compose 的当前稳定版本:

curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

2.对二进制文件应用可执行权限:

chmod +x /usr/local/bin/docker-compose

3.测试安装

docker-compose --version





 Docker的常用命令


 镜像常用命令

 docker pull

从镜像仓库中拉取或者更新指定镜像 

语法 docker pull [OPTIONS] NAME[:TAG|@DIGEST]

OPTIONS说明: 

  • -a :拉取所有 tagged 镜像
  • --disable-content-trust :忽略镜像的校验,默认开启 

例:从Docker Hub下载java最新版镜像。

docker pull java

例:从Docker Hub 安装node:14-alpine

docker pull node:14-alpine  


 docker images  

查看本地安装的镜像列表  



docker pull [镜像名称:版本] 拉取镜像
docker images 镜像列表
docker rmi [镜像名称:版本] 删除镜像
docker history [镜像名称] 镜像操作记录
docker tag [镜像名称:版本][新镜像名称:新版本]
docker inspect [镜像名称:版本] 查看镜像详细
docker search [关键字] 搜索镜像
docker login 镜像登陆


 容器常用命令

 docker run

语法:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

 OPTIONS说明:

  1. -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
  2. -d: 后台运行容器,并返回容器ID;
  3. -i: 以交互模式运行容器,通常与 -t 同时使用;
  4. -P: 随机端口映射,容器内部端口随机映射到主机的高端口
  5. -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
  6. -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
  7. --name="nginx-lb": 为容器指定一个名称;
  8. --dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
  9. --dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
  10. -h "mars": 指定容器的hostname;
  11. -e username="ritchie": 设置环境变量;
  12. --env-file=[]: 从指定文件读入环境变量;
  13. --cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;
  14. -m :设置容器使用内存最大值;
  15. --net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
  16. --link=[]: 添加链接到另一个容器;
  17. --expose=[]: 开放一个端口或一组端口;
  18. --volume , -v: 绑定一个卷
  19.     
  20.    


docker run -tid --name  [容器名称]  [镜像名称:版本]  bash 

   以-t -t -d 模式 创建一个新的容器并运行一个命令bash,例:docker run -itd(启动模式) --name testnode(自定义一个容器名称) node(镜像名称)


绑定容器的 8080 端口,并将其映射到本地主机 127.0.0.1 的 80 端口上。 

 docker run -p 127.0.0.1:80:8080/tcp ubuntu bash

使用镜像 nginx:latest,以后台模式启动一个容器,将容器的 80 端口映射到主机的 80 端口,主机的目录 /data 映射到容器的 /data。 

docker run -p 80:80 -v /data:/data -d nginx:latest 


创建一个卷 docker volume create sharedb

使用卷sharedb,并挂载到 启动容器的 /etc/sharea 目录

docker run -dp 3000:3000 -v sharedb:/etc/sharea debian

在容器中 所有对 /etc/sharea 目录的操作 都会保存在 sharedb 中,删除此容器后,使用 -v sharedb:/etc/sharea  新创建一个容器,你可以在新容器的 /etc/sharea 目录中 看到之前被删除容器 写入的文件

https://docs.docker.com/get-started/05_persisting_data/



  docker exec   

在运行的容器中执行命令

语法
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

OPTIONS

  • -d :分离模式: 在后台运行
  • -i :即使没有附加也保持STDIN 打开
  • -t :分配一个伪终端
例:进入testnode容器查看node版本
 docker exec -it testnode /bin/bash


 也可以通过 docker ps -a 命令查看已经在运行的容器,然后使用容器 ID 进入容器。

查看已经在运行的容器 ID:使用,docker attach 容器id :连接到正在运行中的容器。


退出当前容器exit 或 使用快捷键 ctrl+p+q



 docker start


重新启动容器



docker ps -a 容器列表(所有容器)
docker ps 查看所有(运行的)容器
docker exec -ti <id> bash 以 bash 命令进入容器内 docker run -ti --name [容器名称][镜像名称:版本] bash 创建一个新的容器并运行一个命令bash,
docker logs 查看容器日志 ; docker-compose logs -t --tail="100" 查看容器组 最近100条日志
docker top <container_id> 查看容器最近的一个进程
docker run -ti --name [容器名称] -p 8080:80 [镜像名称:版本] bash 端口映射
docker rm <container_id> 删除容器
docker stop <container_id> 停止容器
docker start <container_id> 开启容器
docker restart <container_id> 重启容器
docker inspect <container_id> 查看容器详情
docker commit [容器名称] my_image:v1.0 容器提交为新的镜像

docker attach 容器id :连接到正在运行中的容器。 attach是可以带上--sig-proxy=false来确保CTRL-D或CTRL-C不会关闭容器。

    退出容器终端且继续运行:按顺序按【ctrl+p】,【ctrl+q】

    结束容器:按【ctrl+d】或输入 exit

docker cp 用于容器与主机之间的数据相互拷贝。


 docker cp

用于容器与主机之间的数据拷贝。 

语法

docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-

docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH


OPTIONS说明:

-L :保持源目标中的链接


实例:

将主机/www/runoob目录拷贝到容器96f7f14e99ab的/www目录下。

docker cp /www/runoob 96f7f14e99ab:/www/

将主机/www/runoob目录拷贝到容器96f7f14e99ab中,目录重命名为www。

docker cp /www/runoob 96f7f14e99ab:/www

将容器96f7f14e99ab的/www目录拷贝到主机的/tmp目录中。

docker cp 96f7f14e99ab:/www /tmp/

docker cp /pdcloud/apiconfig.json apigateway:/pdcloud_gateway/config.json


 清理none


docker 清理掉none对象,未使用网络,缓存等命令
docker system prune

清理none镜像
docker image prune

清理停止的容器
docker container prune

清理卷
docker volume prune

清理没有被容器使用的网络
docker network prune


 docker stats

查看当前运行容器 的 资源使用情况


 docker 启动 mysql

--

运行MySQL容器时可以指定的环境参数有:

    MYSQL_ROOT_PASSWORD : root用户的密码,这里设置的初始化密码为`123456`;
MYSQL_DATABASE : 运行时需要创建的数据库名称;
MYSQL_USER : 运行时需要创建用户名,与MYSQL_PASSWORD一起使用;
MYSQL_PASSWORD : 运行时需要创建的用户名对应的密码,与MYSQL_USER一起使用;
MYSQL_ALLOW_EMPTY_PASSWORD : 是否允许root用户的密码为空,该参数对应的值为:yes;
MYSQL_RANDOM_ROOT_PASSWORD:为root用户生成随机密码;
MYSQL_ONETIME_PASSWORD : 设置root用户的密码必须在第一次登陆时修改(只对5.6以上的版本支持)。
MYSQL_ROOT_PASSWORD 和 MYSQL_RANDOM_ROOT_PASSWORD 两者必须有且只有一个。

以上环境参数来自:https://hub.docker.com/_/mysql


启动一个mysql5.7容器, 同底层主机的目录 /var/lib/mysql,挂载到容器/var/lib/mysql

创建网络myapp


docker network create myapp

需先确保 主机目录 存在  /var/lib/mysql

docker run -d \
     --network myapp --network-alias mysql \
     -v /var/lib/mysql:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \ -e MYSQL_DATABASE=testdb \
mysql:5.7



 docker 启动 postgresql


创建网络myapp

docker network create myapp

需先确保 缩主机 存在  /var/lib/postgresql/data 目录

docker run -d \
--network myapp --network-alias postgres \
-v /var/lib/postgresql/data:/var/lib/postgresql/data \
-p 5432:5432 \
-e POSTGRES_USER=admin \
-e POSTGRES_PASSWORD=123456 \
-e POSTGRES_DB=postgres \
postgres


 docker 启动 rabbitmq


docker run -d \
--network myapp --network-alias rabbitmq \
-p 5672:5672 \
-p 15672:15672 \
rabbitmq:3.8.12-management



 docker 启动redis


使用网络 myapp,指定容器网络别名 rediscache  ,开放主机6379端口到容器端口6379

--appendonly  redis启用数据持久性,数据存储在 主机 appdata  卷 中

docker run -d \
--network myapp --network-alias rediscache \
--name redis \
-v appdata:/data \
redis redis-server --appendonly yes

    -p 6379:6379 \ 存在安全隐患,只可在确保安全的环境下使用 或 设置密码 --requirepass “mypassword” 

 docker 启动一个应用程序容器 (使用mysql、redis)


使用镜像appimage, 使用网络 myapp,指定容器名称testapp ,开放主机80端口 到容器80端口,指定mysql 、redis 环境参数(需和前面创建数据库容器时保持一致) ,

应用程序 可通过,环境参数 dev判断是否 是开发模式

docker run  -d \
--network myapp \
--name testapp \
-p 80:80 \
-e MYSQL_PASSWORD=123456 \
-e MYSQL_HOST=mysql \
-e MYSQL_DB=testdb \
-e MYSQL_USER=root \
-e REDIS_HOST=rediscache \
-e dev=1 \
appimage


 docker compose

-

compose命令行文档:https://docs.docker.com/compose/reference/up/


docker-compose 文件编写规范文档:https://docs.docker.com/compose/compose-file/compose-file-v3/#build


docker-compose.yml 文件参考,

version: "3.1"
services:
#容器名称,同时也是网络别名
robot:
#在当前目录 使用Dockerfile 文件 来 构建 应用 容器
build: .
#依赖的服务,应用服务将在 数据库 服务启动后 在启动
depends_on:
- mysql
- rediscache
ports:
- 80:80
#环镜变量
environment:
MYSQL_PASSWORD: 123456
MYSQL_HOST: mysql
MYSQL_DB: robot
MYSQL_USER: root
REDIS_HOST: rediscache
dev: 1
deploy:
#重启策略
restart_policy:
#故障后30S重启
condition: on-failure
delay: 30S
#最大重启次数 10
max_attempts: 10

mysql:
image: mysql:5.7
volumes:
- /var/lib/mysql:/var/lib/mysql
ports:
- 3306:3306
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: robot

rediscache:
image: redis
command: redis-server --appendonly yes
volumes:
- appdata:/data

volumes:
appdata:


Dockerfile 文件参考

 

# syntax=docker/dockerfile:1
##
## Build, 使用多阶构建,最后将可执行文件打包到精简 debian系统 执行
##
FROM golang:1.17.1 AS build
WORKDIR /app
# RUN apt update && apt install build-essential
COPY ["go.mod", "go.sum", "./"]
RUN GO111MODULE=on GOPROXY=https://goproxy.cn go mod download
COPY . .
RUN go build -ldflags "-w -s" -o ./robot


##
## Deploy
##
FROM debian:stable-slim
WORKDIR /app
COPY --from=build /app .
EXPOSE 80
CMD [ "/app/robot" ]


docker-compose 启动:docker-compose up -d

-

 docker compose(开发模式)


docker-compose.yml 文件参考,

version: "3.1"
services:
robot:
#在当前目录 使用DockerfileDev文件 来 构建 应用 容器
build:
context: .
#指定使用开发模式的 Dockerfile
dockerfile: DockerfileDev
#依赖的服务,应用服务将在 数据库 服务启动后 在启动
depends_on:
- mysql
- rediscache
ports:
- 80:80
#指定工作目录
working_dir: /app
#绑定当前应用目录 到容器 ,开发模式才需要设置
volumes:
- ./:/app
#环镜变量
environment:
MYSQL_PASSWORD: 123456
MYSQL_HOST: mysql
MYSQL_DB: robot
MYSQL_USER: root
REDIS_HOST: rediscache
dev: 1
deploy:
#重启策略
restart_policy:
#故障后30S重启
condition: on-failure
delay: 30S
#最大重启次数 10
max_attempts: 10

mysql:
image: mysql:5.7
#绑定宿主机目录 到mysql容器数据目录
volumes:
- /var/lib/mysql:/var/lib/mysql
ports:
- 3306:3306
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: robot

rediscache:
image: redis
command: redis-server --appendonly yes
volumes:
- appdata:/data
volumes:
appdata:


DockerfileDev文件参考 


# syntax=docker/dockerfile:1
##
## Build, 开发模式
##
FROM golang:1.17.1
WORKDIR /app
COPY ["go.mod", "go.sum", "./"]
#RUN GO111MODULE=on GOPROXY=https://goproxy.cn go mod download
RUN go mod download
# 安装 热编译 模块
RUN wget -O gf https://github.com/gogf/gf-cli/releases/download/v1.16.3/gf_linux_amd64 && chmod +x gf && ./gf install
#热编译模式运行,宿主机改动.go源码后,会触发重新编译
CMD [ "sh", "-c", "gf run main.go" ]


收藏
分享
评论 0
关于作者

风轻云淡

多读书 少写代码

标签云
统计信息

文章总数:188

累计访问: 次

今日访问: 次

在线人数: 人