docker命令记录

安装及配置docker(基于Ubuntu)sasurai@ubuntu:~$ sudo apt install docker.iosasurai@ubuntu:~$ docker versionClient: Version: 19.03.2 API version:

安装及配置docker(基于Ubuntu)

sasurai@ubuntu:~$ sudo apt install docker.io
sasurai@ubuntu:~$ docker version
Client:
 Version:           19.03.2
 API version:       1.40
 Go version:        go1.12.9
 Git commit:        6a30dfca03
 Built:             Mon Sep 16 03:56:22 2019
 OS/Arch:           linux/amd64
 Experimental:      false

Server:
 Engine:
  Version:          19.03.2
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.9
  Git commit:       6a30dfca03
  Built:            Wed Sep 11 22:45:55 2019
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.2.10-0ubuntu1
  GitCommit:
 runc:
  Version:          spec: 1.0.1-dev
  GitCommit:
 docker-init:
  Version:          0.18.0
  GitCommit:

设置为阿里云的镜像加速器

sudo vim /etc/docker/daemon.json

内容如下:

{
    "registry-mirrors": ["https://xxxxx.mirror.aliyuncs.com"]
}

重启docker:

sudo systemctl daemon-reload
sudo systemctl restart docker

免sudo使用docker命令

Linux 中将用户添加到指定组的指令

将一个已有用户 testuser 增加到一个已有用户组 root 中,使此用户组成为该用户的附加用户组,可以使用带 -a 参数的 usermod 指令。-a 代表 append, 也就是将用户添加到新用户组中而不必离开原有的其他用户组。不过需要与 -G 选项配合使用:usermod -a -G root testuser如果要同时将 testuser 的主要用户组改为 root,则直接使用 -g 选项:usermod -g root testuser如果要将testuser用户从root组中删除,则gpasswd -d testuser root

# 将当前用户加入docker组
sudo gpasswd -a $USER docker

注销该用户后,重新登录该用户

网上还有一种修改如下:

# 新增docker组(如果不存在docker组)
sudo groupadd docker
# docker组中加入当前用户
sudo usermod -aG docker $USER
# 重启docker服务
sudo systemctl restart docker

也有稍微带了一点说明的如下:

Docker守候进程绑定的是一个unix socket,而不是TCP端口。这个套接字默认的属主是root,其他是用户可以使用sudo命令来访问这个套接字文件。因为这个原因,docker服务进程都是以root帐号的身份运行的。当docker进程启动的时候,会设置该套接字可以被docker这个分组的用户读写。

但是少了一个验证的环节,/var/run/docker.sock的具体权限如下:

# socket文件权限
sasurai@ubuntu:~$ ll /var/run/docker.sock
srw-rw---- 1 root docker 0 Nov 18 01:05 /var/run/docker.sock=
# docker命令权限
sasurai@ubuntu:~$ ll `which docker`
-rwxr-xr-x 1 root root 89057216 Sep 11 15:45 /usr/bin/docker*

从以上权限可看出:

/var/run/docker.sock,其他用户无读写权限,只有docker组用户和root用户可以读写。而对docker命令来说,任何用户都可以运改命令,但是并不一定都能通过该命令操作/var/run/docker.sock

拉取MySQL镜像

可用的标签如下:

  • 8.0.18, 8.0, 8, latest
  • 5.7.28, 5.7, 5
  • 5.6.46, 5.6

这里选择5.7版本的MySQL数据库:docker pull mysql:5.7

将MySQL跑起来

最简单的方式:

docker run \ # Run a command in a new container
--name mysql-master \ # Assign a name to the container
-e MYSQL_ROOT_PASSWORD=mysql-master \ # Set environment variables
-p 3306:3306 \ # Publish a container's port(s) to the host
mysql:5.7 # 镜像名称:版本号

环境变量

MYSQL_ROOT_PASSWORD强制要求的,会在容器创建时将root用户密码设置成改变量的值。没有启动会报错,如下所示:

sasurai@ubuntu:~$ docker run --name mysql-master2 -p 3307:3307 mysql:5.7
2019-11-19 06:16:27+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.28-1debian9 started.
2019-11-19 06:16:27+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2019-11-19 06:16:27+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.28-1debian9 started.
2019-11-19 06:16:27+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified
        You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD

MYSQL_DATABASE:可选项。会在容器创建的时候创建改数据库。如果有指定用户名和密码,会将该用户设置成改数据库的超级用户。

MYSQL_USER, MYSQL_PASSWORD:可选项。容器创建时创建该用户。

挂载自定义配置文件

docker run --name some-mysql \
-v /my/custom:/etc/mysql/conf.d \ # Bind mount a volume
-e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

疑问

docker rundocker container run之间是什么关系?

CLI restructured
Docker has grown many features over the past couple years and the Docker CLI now has a lot of commands (40 at the time of writing). Some, like build or run are used a lot, some are more obscure, like pause or history. The many top-level commands clutters help pages and makes tab-completion harder.
In Docker 1.13, we regrouped every command to sit under the logical object it’s interacting with. For example list and startof containers are now subcommands of docker container and history is a subcommand of docker image.
docker container list
docker container start
docker image history
These changes let us clean up the Docker CLI syntax, improve help text and make Docker simpler to use. The old command syntax is still supported, but we encourage everybody to adopt the new syntax.

from : https://www.docker.com/blog/whats-new-in-docker-1-13/

简而言之,两者等效,但是后者是命令重构之后的写法,更推荐后面的写法。同时,还有很多其他类似的命令如:docker startdocker container start,也是同样的道理。但是感觉前面的命令不用敲container,用起来还是蛮香的。

真香

Read more

Volcano 与 Kubernetes GPU 调度学习笔记

本笔记系统整理 Volcano 调度器、Kubernetes 调度框架、GPU Device Plugin、HAMi 等云原生 AI 调度领域的核心知识,适合用于学习、复习和工程实践参考。 目录 * 第一部分:Volcano 入门 * 1. Volcano 是什么 * 2. 安装与快速使用 * 3. 核心特性一览 * 第二部分:Volcano 整体架构 * 4. Volcano 解决的核心问题 * 5. 整体架构与数据流 * 6. 三层抽象模型 * 第三部分:Volcano 核心实现原理 * 7. Session 机制 * 8. Gang Scheduling 实现 * 9. Queue 与 DRF 公平调度

容器镜像(4):镜像的常用工具箱

容器镜像(4):镜像的常用工具箱

前几篇在讲多架构镜像时已经用过 skopeo 和 crane 做镜像复制,这篇系统整理这两个工具的完整能力,同时介绍几个日常操作镜像时同样好用的工具。 一、skopeo:不依赖 Daemon 的镜像瑞士军刀 skopeo 的核心价值是绕过 Docker daemon,直接与 Registry API 交互。上一篇用它做镜像复制和离线传输,但它的能力远不止于此。 1.1 安装 # Ubuntu / Debian sudo apt install -y skopeo skopeo --version # skopeo version 1.15.1 1.2 inspect:免拉取检查镜像元数据 docker inspect 需要先把镜像拉到本地,skopeo inspect 直接向 Registry

容器镜像(3):多架构镜像构建

容器镜像(3):多架构镜像构建

一、什么是多架构镜像 1.1 OCI Image Index 上一篇介绍了单平台镜像的结构:一个 Manifest 指向 Config 和若干 Layer blob。多架构镜像在此之上多了一层——OCI Image Index(也叫 Manifest List),是一个轻量的索引文件,把多个单平台 Manifest 组织在一起: $ docker manifest inspect golang:1.22-alpine { "schemaVersion": 2, "mediaType": "application/vnd.oci.image.index.v1+json", "manifests&

容器镜像(2):containerd 视角下的镜像

容器镜像(2):containerd 视角下的镜像

一、为什么需要了解 containerd 如果你只用 docker run 跑容器,从来不关心底层,那可以不了解 containerd。但如果你在用 Kubernetes,或者想真正理解"容器运行时"是什么,containerd 是绕不开的。 事实上,当你执行 docker run 的时候,containerd 早就在后台悄悄工作了——Docker 从 1.11 版本开始,就把核心运行时剥离出来交给 containerd 负责。 1.1 Docker 的架构演变 早期的 Docker(1.10 及之前)是一个"大一统"的单体程序:一个 dockerd