Docker笔记


dockerfiles编写

FROM:继承的镜像,docker容器必须要继承一个镜像

MAINTAINER:维护人员信息 ideask<ideask@outlook.com>

ENV:需要配置环境变量

RUN:后面是执行的命令

EXPOSE:声明需要维护的端口,用处不大,但是对镜像使用者进行提醒

CMD:通过CMD指令指定容器启动时要执行的命令,执行路径!!记得设置,譬如要下载和解压文件,必须指定路径而且&&并着来执行,不然路径会出错!!!!!

Volume : 要挂载的目录

COPY:命令用于将于Dockerfile所在目录中的文件在镜像构建阶段从宿主机拷贝到镜像中,对于文件而言可以直接将文件复制到镜像中

ADD:命令相对于COPY命令,可以解压缩文件并把它们添加到镜像中的功能,如果我们有一个压缩文件包,并且需要把这个压缩包中的文件添加到镜像中。需不需要先解开压缩包然后执行 COPY 命令呢?当然不需要!我们可以通过 ADD 命令一次搞定

docker build

1
docker build -f bbb-ubuntu14-sshd -t bbb-ubuntu14-sshd-env:1.0 .

docker commit

1
2
3
4
5
6
7
8
9
10
11
12
13
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
OPTIONS说明:
-a :提交的镜像作者;
-c :使用Dockerfile指令来创建镜像;
-m :提交时的说明文字;
-p :在commit时,将容器暂停。

runoob@runoob:~$ docker commit -a "runoob.com" -m "my apache" a404c6c174a2 mymysql:v1
sha256:37af1236adef1544e8886be23010b66577647a40bc02c0885a6600b33ee28057
runoob@runoob:~$ docker images mymysql:v1
REPOSITORY TAG IMAGE ID CREATED SIZE
mymysql v1 37af1236adef 15 seconds ago 329 MB

docker images

docker images history

1
查看镜像提交历史

docker ps / docker ps -a

1
2
3
4
//查看当前运行的容器
docker ps
//查看所有容器
docker ps -a

docker stop

1
停止容器

docker start

1
开启容器

docker exec

1
在运行的容器里运行某一程序或脚本

docker rm

1
删除容器

docker rmi

1
删除容器的镜像

docker update

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
描述
更新一个或多个容器的配置。

语法
docker update [OPTIONS] CONTAINER [CONTAINER...]
OPTIONS 说明:
--blkio-weight 阻塞IO (相对权重),介于10到1000之间,0表示禁用(默认禁止)
--cpu-period 限制CPU CFS(完全公平的调度程序)期限
--cpu-quota 限制CPU CFS(完全公平的调度程序)配额
--cpu-rt-period API 1.25+,将CPU实时时间限制为微秒
--cpu-rt-runtime API 1.25+,将CPU实时运行时间限制为微秒
--cpu-shares, -c CPU份额(相对权重)
--cpus API 1.29+,CPU数量
--cpuset-cpus 允许执行的CPU(0-3,0,1)
--cpuset-mem 允许执行的MEM(0-3,0,1)
--kernel-memory 内核内存限制
--memory-swap 交换限制等于内存加交换,“-1”以启用无限交换
--memory-reservatio 内存软限制
--memory, -m 内存限制
--pids-limit API 1.40+,调节容器pids限制(-1表示无限制)
--restart 容器退出时重新启动策略以应用

实例:
1.更新 CPU 共享数量
# f361b7d8465 为 容器ID
docker update --cpu-shares 512 f361b7d8465
2.更新容器的重启策略
docker update --restart=always f361b7d8465
3.更新容器内存
docker update -m 500M f361b7d8465

docker create

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//创建一个容器暂时不运行,语法同下 run一样
//docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
//--name 指定一个容器别名
//-e 设置环境变量
//-v 挂载文件目录
//-p 端口映射

docker create --name=hexo-domain.com \
-e HEXO_SERVER_PORT=4000 \
-e GIT_USER="Your Name" \
-e GIT_EMAIL="your.email@domain.tld" \
-v /blog/domain.com:/app \
-p 4000:4000 \
spurin/hexo

docker run

1
2
// -d 以守护进程运行 -p 指定端口映射宿主机端口:容器端口 
docker run -d -p 101:22 bbb-ubuntu14-sshd:1.0

docker logs

1
2
3
4
5
6
7
8
9
10
docker logs [OPTIONS] CONTAINER
OPTIONS说明:

-f : 跟踪日志输出

--since :显示某个开始时间的所有日志

-t : 显示时间戳

--tail :仅列出最新N条容器日志

docker导入导出镜像方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
导入导出命令介绍
涉及的命令有export、import、save、load
save命令:
docker save [options] images [images...]
示例
docker save -o nginx.tar nginx:latest

docker save > nginx.tar nginx:latest
其中-o和>表示输出到文件,nginx.tar为目标文件,nginx:latest是源镜像名(name:tag)
load命令:
docker load [options]
示例
docker load -i nginx.tar

docker load < nginx.tar
其中-i和<表示从文件输入。会成功导入镜像及相关元数据,包括tag信息
export命令:
docker export [options] container
示例
docker export -o nginx-test.tar nginx-test
其中-o表示输出到文件,nginx-test.tar为目标文件,nginx-test是源容器名(name)
import命令:
docker import [options] file|URL|- [REPOSITORY[:TAG]]
示例
docker import nginx-test.tar nginx:imp

cat nginx-test.tar | docker import - nginx:imp
区别:
export命令导出的tar文件略小于save命令导出的
export命令是从容器(container)中导出tar文件,而save命令则是从镜像(images)中导出
基于第二点,export导出的文件再import回去时,无法保留镜像所有历史(即每一层layer信息,不熟悉的可以去看Dockerfile),不能进行回滚操作;而save是依据镜像来的,所以导入时可以完整保留下每一层layer信息。如下图所示,nginx:latest是save导出load导入的,nginx:imp是export导出import导入的。
建议:
可以依据具体使用场景来选择命令,若是只想备份images,使用save、load即可
若是在启动容器后,容器内容有变化,需要备份,则使用export、import

常见问题集

解决:Dockerfile 中执行 tar

1
2
3
4
5
6
7
8
tar (child): xz: Cannot exec: No such file or directory
tar (child): Error is not recoverable: exiting now
tar: Child returned status 2
tar: Error is not recoverable: exiting now

原因: 没装xz组件
解决:
apt-get install xz-utils

例子-创建一个ubuntu14带有sshd服务的容器并且部署好开发环境

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# BBB builder docker
# BBB builder docker
# creater by IDEASK
# July 27 2021
# 继承ubuntu14的镜像
FROM ubuntu:14.04
# 维护者名字和邮箱
MAINTAINER ideask<ideask@outlook.com>
# 设置环境变量,使用的xterm是图形界面下virtual terminal的一个实现,应该是有颜色显示吧
ENV TERM=xterm
ENV WORKDIR=/home/BBB/build
# 不使用dash 使用bash | 使用静默安装,全部按默认设置
RUN echo "dash dash/sh boolean false" | debconf-set-selections \
# 大多数发行版不会包含 /usr/sbin/policy-rc.d 文件,因为这个文件是用于帮助管理员控制哪些包可以在安装、卸载、更新时执行脚本。而在 docker 容器中,大多数 apt-get install 发生在 docker build 阶段,这个阶段如果去启动/停止服务,可能因为一些意外而无法成功并且也没有必要。大多数服务都是在 docker run 或 docker start 时启动/停止。如果你一定要启动/停止服务,可以将 /usr/sbin/policy-rc.d 文件中的返回值改为0,因为后续我们要启动sshd的服务
&& echo "#!/bin/sh\nexit 0" > /usr/sbin/policy-rc.d \
# 不使用dash
&& dpkg-reconfigure -p critical dash \
&& apt-get update \
&& apt-get install -y openssh-server git gitk wget xz-utils python dpkg lzma pkg-config libncurses5-dev \
autoconf automake cmake libtool \
&& apt-get update \
&& apt-get clean \
# 指定新工作组BBB的组ID是1000 -g指定新工作组的ID
&& groupadd -g 1000 BBB \
# -u指定用户ID -g指定用户所属工作组 -G指定用户所属附加工作组 -m自动建立用户的登入目录 最后是新用户的名字
&& useradd -u 1000 -g 1000 -G sudo -m BBB \
&& mkdir -p $WORKDIR \
# 对新用户的目录改变其所属工作组和用户
&& chown BBB:BBB $WORKDIR \
# 批量更改密码的指令
&& echo "BBB:ideask" | chpasswd \
&& echo "root:ideask" | chpasswd \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* \
&& cd $WORKDIR
# 创建sshd的运行目录,不然打开服务会出错
RUN mkdir -p /var/run/sshd
# 允许root连接
RUN sed -i 's/PermitRootLogin without-password/PermitRootLogin yes/g' /etc/ssh/sshd_config
# 下载gcc交叉编译工具
RUN cd $WORKDIR \
&& wget -c -O gcc.tar.xz https://releases.linaro.org/components/toolchain/binaries/6.5-2018.12/arm-linux-gnueabihf/gcc-linaro-6.5.0-2018.12-x86_64_arm-linux-gnueabihf.tar.xz \
&& tar -xf gcc.tar.xz \
&& export CC=`pwd`/gcc-linaro-6.5.0-2018.12-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-
# 克隆uboot
RUN cd $WORKDIR \
&& git clone -b v2019.04 https://gitee.com/ideask/u-boot.git --depth=1 \
&& cd u-boot \
&& pwd \
&& ls \
&& git pull --no-edit https://gitee.com/ideask/u-boot-bbb.git v2019.04-bbb.io-am335x
# 克隆kernel
RUN cd $WORKDIR \
&& pwd \
&& ls \
&& git clone https://gitee.com/ideask/ti-linux-kernel-dev.git \
&& cd ti-linux-kernel-dev/ \
&& pwd \
&& ls \
&& git checkout origin/ti-linux-rt-5.10.y -b tmp
# 下载ubuntu20.04LTS-rootfs user:ubuntu password:temppwd
RUN cd $WORKDIR \
&& wget -c https://rcn-ee.com/rootfs/eewiki/minfs/ubuntu-20.04.2-minimal-armhf-2021-06-20.tar.xz \
&& tar xf ubuntu-20.04.2-minimal-armhf-2021-06-20.tar.xz

# 声明要映射的端口号
EXPOSE 22
# 以守护进程的方式运行sshd
CMD ["/usr/sbin/sshd", "-D"]
ENV TERM=xterm-256color \
TERMINFO=/lib/terminfo


← Prev BeagleBoneBlack开发环境 | Ubuntu服务器环境搭建 Next →