You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

350 lines
9.6 KiB

1 year ago
[appendix]
= Docker 常用命令
详细的 Docker 使用指南,请参考 link:resources/files/docker_practice.pdf[《Docker - 从入门到实践》],以下仅列出一些常用命令。
== docker 服务启停
[source,bash]
----
# 启动 docker
service docker start
# 停止 docker
service docker stop
# 重新启动 docker
service docker restart
----
== 镜像加速器配置
国内从 Docker Hub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。
Docker 官方和国内很多云服务商都提供了国内加速服务,例如:
* Docker 官方提供的中国 registry mirror
* 阿里云加速器
* DaoCloud 加速器
=== Windows 10 镜像加速器配置
对于使用 Windows 10 的用户,在系统右下角托盘 Docker 图标内右键菜单选择 Settings,
打开配置窗口后左侧导航菜单选择 Docker Daemon。
编辑窗口内的 JSON 串,填写加速器地址,例如:
[source,json]
----
{
"registry-mirros" : [
"https://registry.docker-cn.com"
]
}
----
编辑完成,点击 Apply 保存后 Docker 服务会重新启动。
=== Mac OS X 镜像加速器配置
对于使用 Mac OS X 的用户,在任务栏点击 Docker for Mac 应用图标 --> Perferences... --> Daemon --> Registry mirrors。
在列表中填写加速器地址即可。修改完成后,点击 Apply & Restart 按钮,Docker 就会重新启动并应用配置的镜像地址了。
=== 检查加速器是否生效
配置加速器之后,如果拉取镜像仍然十分缓慢,请手动检查加速器配置是否生效,在命令行执行
[source,bash]
----
docker info
#如果从结果中看到如下内容,说明配置成功。
Registry Mirrors:
https://registry.docker-cn.com/
----
== 镜像操作
=== 获取镜像
在 Docker Hub 上有大量的高质量的镜像可以使用,这里我们就说一下怎么获取这些镜像。
从 Docker 镜像仓库中获取镜像的命令是 docker pull, 其命令格式为:
[source,bash]
----
docker pull [选项] [Docker Registry 地址[:端口号]/] 仓库名[:标签]
----
具体的选项可以通过 docker pull --help 命令查看,这里我们说一下镜像名称的格式。
* Docker 镜像仓库地址: 地址的格式一般是 <域名/IP>[:端口号],默认地址是 Docker Hub
* 仓库名:仓库名的格式一般是<用户名>/<软件名>。对于 Docker Hub,如果不给出用户名,默认为 library,也就是官方镜像。
以下给出一些示例:
[source,bash]
----
docker pull ubuntu:16.04 #从官方仓库中获取 ubuntu 16.04 镜像
docker pull ibmcom/db2express-c #从官方仓库中获取 ibm 公司提供的 db2express-c 最新版镜像
----
=== 列出镜像
[source,bash]
----
docker image ls
----
=== 删除镜像
[source,bash]
----
docker image rm 镜像ID
----
=== 镜像导出
[source,bash]
----
docker save -o 导出文件名.tar 需要导出的镜像名
----
以下给出一些示例:
[source,bash]
----
docker save -o mysql.tar mysql
docker save -o oracle11g.tar sath89/oracle-ee-11g
----
=== 镜像导入
[source,bash]
----
docker load --input 导出文件名.tar
----
以下给出一些示例:
[source,bash]
----
docker load --input mysql.tar
docker load --input oracle11g.tar
----
=== 镜像构建
[source,bash]
----
docker build [选项] <上下文路径/URL/>
----
以下给出一些示例:
[source,bash]
----
# 采用当前目录作为构建上下文
docker build -t nginx:v3 .
----------- -
选项 上下文路径
# 从 Git 仓库 URL 构建
docker build https://github.com/twang2218/gitlab-ce-zh.git#:11.1
--------------------------------------------- ----
git repo(默认master 分支) 构建目录
# 用给定的远程 tar 压缩包构建, 先下载解压再作为构建上下文
docker build http://server/content.tar.gz
# 用给定的本地 tar 压缩包构建(支持文件格式: gzip, bzip2, xz)
docker build - <content.tar.gz
# 从标准输入中读取 Dockerfile 进行构建,这种构建没有构建上下文,不能进行 COPY 之类的操作
docker build - < Dockerfile
# 或
cat Dockerfile | docker build -
----
== 容器操作
=== 运行容器
[source,bash]
----
docker run
--name gitlab \ //<1>
--restart always \ //<2>
-d \ //<3>
-p 10443:443 \ //<4>
-p 1080:80 \
-p 1022:22 \
-v /path/to/your/host/dir/volume/gitlab_v10/config:/etc/gitlab:Z \ //<5>
-v /path/to/your/host/dir/volume/gitlab_v10/logs:/var/log/gitlab:Z \
-v /path/to/your/host/dir/volume/gitlab_v10/data:/var/opt/gitlab:Z \
gitlab/gitlab-ce:latest //<6>
----
<1> 容器名称
<2> 自动启动,即当 docker 启动后,容器就自动启动
<3> 容器在后台以守护状态运行
<4> 端口映射,格式: 本地主机端口:容器端口
<5> 数据卷映射, 格式: 本地主机目录或文件:容器目录或文件
<6> 镜像名称,格式: 仓库名[:标签]
=== 创建容器
创建容器有两种方法,可以创建并启动,也可以只创建不启动,在解决容器相关问题时,此模式比较有意义。
[source,bash]
----
# 创建容器,但不启动
docker create --name 容器名称 镜像名称
# 将容器的目录全部导出成 tar 文件
docker export 容器名称 > 导出文件名.tar
# 解压 tar 文件后,可以查看容器完整的文件系统
----
=== 列出容器
[source,bash]
----
docker container ls -a
----
=== 列出当前正在运行的容器
[source,bash]
----
docker ps
----
=== 启动容器
[source,bash]
----
docker container start 容器ID
----
=== 停止容器
[source,bash]
----
docker container stop 容器ID
----
=== 删除容器
[source,bash]
----
docker container rm 容器ID
----
=== 进入容器
[source,bash]
----
docker exec -it 容器ID bash
----
== 网络操作
=== 命令集
[source,bash]
----
# 关于 docker network 相关命令
docker network create
docker network connect
docker network ls
docker network rm
docker network disconnect
docker network inspect
----
=== 创建网桥
[source,bash]
----
# 创建名为 mynetwork 的网桥
docker network create --driver bridge --subnet 172.18.0.0/16 mynetwork
----
=== 查看网桥配置
[source,bash]
----
# 查看名为 mynetwork 网桥的配置
docker network inspect mynetwork
----
=== 固定容器 IP 地址
[source,bash]
----
# 在名为 mynetwork 网桥上固定 ip 地址启动容器
docker run -d --name hdp -v /opt/docker/volume/nginx:/usr/share/nginx/html --network=hadoop --ip=172.18.0.100 nginx
----
=== 将已有容器加入到网络
[source,bash]
----
# 将已存在的 nginx 容器加入到 hadoop 网络中
docker network conect hadoop nginx
----
=== 容器访问宿主机IP
docker 18.03 加入了一个 feature,在容器中可以通过 host.docker.internal 来访问主机。
== 数据卷操作
=== 创建卷
[source,bash]
----
docker volume create xxx # xxx 卷名称
----
=== 显示卷信息
[source,bash]
----
docker volume inspect xxx # xxx 卷名称
# 执行结果如下:
[
{
"CreatedAt": "2023-04-16T13:00:36Z",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/oracle/_data", <1>
"Name": "oracle",
"Options": {},
"Scope": "local"
}
]
----
<1> 主机目录,如果是 mac OS 或 windows 下的 docker 时,通常是指虚拟机中的目录
=== 绑定卷到容器
[source,bash]
----
docker run -d --name oracle -v volume-name:container-dir container-registry.oracle.com/database/express:21.3.0-xe
----------- -------------
卷名称 容器目录 <1>
----
<1> -v 参数既可以绑定卷到容器中,也可以绑定主机目录到容器中
=== 数据共享
如果要授权一个容器访问另一个容器的 Volume,我们可以使用 -volumes-from 参数来执行 docker run。
[source,bash]
----
# 多个 oracle 实例共享一个卷中的数据
docker run -d --name oracle2 --volumes-from oracle container-registry.oracle.com/database/express:21.3.0-xe
------ --------------------------------------------------------
共享卷 镜像名
----
=== 数据容器
常见的使用场景是使用纯数据容器来持久化数据库、配置文件或者数据文件等。
[source,bash]
----
# 创建一个已经包含在 Dockerfile 里定义过 Volume 的 postgres 镜像,运行 echo 命令然后退出。
# 当我们运行 docker ps 命令时,echo 可以帮助我们识别某镜像的用途。
docker run --name dbdata postgres echo "Data-only container for postgres"
----
用 -volumes-from 命令来识别其它容器的 Volume
[source,bash]
----
# 运行另外一个 postgres 数据库容器,且采用上面的数据容器中的卷
docker run -d --volumes-from dbdata --name db1 postgres
----
使用数据容器的两个注意点:
. 不要运行数据容器,这纯粹是在浪费资源。
. 不要为了数据容器而使用“最小的镜像”,如 busybox 或 scratch,只使用数据库镜像本身就可以了。你已经拥有该镜像,所以并不需要占用额外的空间。
=== 卷备份
如果你在用数据容器,那做备份是相当容易的。
[source,bash]
----
$ docker run --rm --volumes-from dbdata -v $(pwd):/backup debian tar cvf /backup/backup.tar /var/lib/postgresql/data
---- ------ ------ ------- ------ ---------------------------------------------------
1 2 3 4 5
----
. --rm 表示容器在执行完毕后删除
. 挂接到已有的数据卷
. 挂接主机当前目录到容器的 /backup 目录
. 运行的镜像名
. 在启动的容器中执行 tar 命令,将 /var/lib/postgresql/data 目录压缩打包到 /backup/backup.tar 文件,