Docker 学习笔记
登录 docker login
docker login quay.io/alvinhtml/test
# 输入 username
# 输入 password
docker images
docker images
docker pull
docker pull springcloud/eureka
docker tag
docker tag springcloud/eureka:latest 192.168.14.3:443/library/eureka:latest
docker push
docker push 192.168.14.3:443/library/eureka
docker save
将指定镜像保存成 tar 归档文件。语法:
docker save [OPTIONS] IMAGE [IMAGE...]
OPTIONS 说明:
- -o :输出到的文件。
docker save -o my_ubuntu_v3.tar runoob/ubuntu:v3
# or
docker save docker.nicescale.com:443/csphere/golang-1.14 > ./csphere-golang-1.14.tar
docker load
docker load -i my_ubuntu_v3.tar
# 或以下代码,同等效应
docker load < my_ubuntu_v3.tar
docker import & docker export
export 和 import 导出的是一个容器的快照, 不是镜像本身, 也就是说没有 layer。dockerfile 里的 workdir, entrypoint 之类的所有东西都会丢失,commit 过的话也会丢失。
- docker save 保存的是镜像(image),docker export 保存的是容器(container);
- docker load 用来载入镜像包,docker import 用来载入容器包,但两者都会恢复为镜像;
- docker load 不能对载入的镜像重命名,而 docker import 可以为镜像指定新名称。
docker ps 列出容器
语法:
docker ps [OPTIONS]
OPTIONS 说明:
参数 | 说明 |
---|---|
-a | 显示所有的容器,包括未运行的。 |
-f | 根据条件过滤显示的内容。 |
--format | 指定返回值的模板文件。 |
-l | 显示最近创建的容器。 |
-n | 列出最近创建的 n 个容器。 |
--no-trunc | 不截断输出。 |
-q | 静默模式,只显示容器编号。 |
-s | 显示总的文件大小。 |
Docker run 命令
创建一个新的容器并运行一个命令,语法:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS 说明:
参数 | 说明 |
---|---|
-a stdin | 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项; |
-d | 后台运行容器,并返回容器 ID; |
-i | 以交互模式运行容器,通常与 -t 同时使用; |
-p | 端口映射,格式为:主机(宿主)端口:容器端口 |
-t | 为容器重新分配一个伪输入终端,通常与 -i 同时使用; |
--name="nginx-lb" | 为容器指定一个名称; |
--dns 8.8.8.8 | 指定容器使用的 DNS 服务器,默认和宿主一致; |
--dns-search example.com | 指定容器 DNS 搜索域名,默认和宿主一致; |
-h "mars" | 指定容器的 hostname; |
-e username="ritchie" | 设置环境变量; |
--env-file=[] | 从指定文件读入环境变量; |
--cpuset="0-2" or --cpuset="0,1,2" | 绑定容器到指定 CPU 运行; |
-m :设置容器使用内存最大值; --net="bridge"|指定容器的网络连接类型,支持 bridge/host/none/container|四种类型; --link=[]|添加链接到另一个容器; --expose=[]|开放一个端口或一组端口;
运行一个容器
docker run --name=node8 -v $PWD:/app -p 7070:7070 -w /app -it node:8 bash
docker run --name=rancher-node8 -w /app -v $PWD:/app -p 8000:8000 -it bash
启动一个 Docker 容器
docker start containername
运行 docker 下的 bash
docker exec -it containername bash
退出 docker 下的 bash
exit;
docker build
docker build .
docker build -f Dockerfile.debug .
Dokcerfile
FROM node:8
WORKDIR /app
RUN \
git clone https://github.com/facebook/watchman.git &&\
cd watchman &&\
git checkout v4.9.0 &&\
./autogen.sh &&\
./configure &&\
make &&\
make install
- FROM 定制的镜像都是基于 FROM 的镜像,这里的 nginx 就是定制需要的基础镜像。后续的操作都是基于 nginx。
- WORKDIR 指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在
- RUN 用于执行后面跟着的命令行命令。有以下俩种格式:shell 格式、exec 格式。
- COPY 复制指令,从上下文目录中复制文件或者目录到容器里指定路径:
COPY hom?.txt /mydir/
- ADD 指令和 COPY 的使用格式一致, 源文件压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压。
- CMD 类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:
- CMD 在 docker run 时运行。
- RUN 是在 docker build。
- ENV 设置环境变量,在后续的指令中使用。
docker build -t nginx:v3 .
.dockerignore
node_modules
多节段构建
第一个节段用来构建需要的文件,第二个节段基于一个精简镜像将上一个节段构建好的文件 copy 过去
FROM gcc AS mybuildstage
COPY hello.c .
RUN gcc -o hello hello.c
FROM ubuntu
COPY --from=mybuildstage hello .
CMD ["./hello"]
Dokcer network
docker network create -d ipvlan \
--subnet=192.168.14.0/22 \
--gateway=192.168.12.1 \
-o "ipvlan_mode"="l2" \
-o "parent"="eth0" br0
批量删除容器
删除 docker container 和 docker image 的关键都是找到准确的 ID。所以,如果能批量提供 ID 号给删除命令,就能实现批量删除了。
批量获取容器 ID 和镜像 ID
获取容器 ID:
docker container ls -a -q
2de6da0c4bd4
13a281a930ae
e9a95cf3b698
122f540ed44b
0913aa6263b1
0422216a248b
491a5136409c
c6c6373a3e50
d048cd4c405b
获取镜像 ID :
docker image ls -a -q
d499bdb8fd09
6fb74f33a5e1
4c0a26e51da8
2b37f252629b
2817cb463960
eb516548c180
a89b45f36d5e
d531d047a4e2
643c21638c1c
批量停止和删除容器
批量停止容器 :
docker stop $(docker container ls -a -q)
批量删除容器 :
docker rm $(docker container ls -a -q)
批量删除镜像 :
docker rmi $(docker image ls -a -q)
如果只想批量删除一部分容器或者镜像呢?这个需求也很容易实现,想象如下的简单场景:将要删除的容器名写到一个文档,然后根据提供的名字,再结合 grep 、awk 等命令,就可以轻松地获取准确的 ID
Docker 部署 Mysql 示例
sudo docker run --name xbackup-mysql -p 3306:3306 -v /data/xbackup:/xbackup -e MYSQL\_ROOT\_PASSWORD=123456 -d mysql