docker(一)--基础命令
什么是容器
一种虚拟化的方案
操作系统级别的虚拟化
只能运行相同或相似内核的操作系统
依赖于linux内核特性:namespace和cgroups(control group)
linux namespaces 命名空间
通过namespaces将以下资源隔离:
uts(unix timesharing system)主机名和域名 ipc(inter-process communication)信号量、消息队列和共享内存 跨进程通信的访问 pid(processid) 进程编号 net(network) 管理网络接口,网络设备、网络栈、端口等 mnt(mount) 管理挂载点(文件系统) user 用户和用户组
control groups(cgroups)控制组 用户空间的资源分配
blkio:块设备io
cpu:cpu
cpuacct:cpu资源使用报告
cpuset:多处理器平台上的cpu集合
devices: 设备访问
freezer:挂起或恢复任务
memeory:内存用量及报告
perf_event:对cgroup中的任务进行统一性能测
net_cls:cgroup中的任务创建的数据报文的类别
镜像:静态
容器:动态的,有生命周期
安装docker
依赖环境:
- 64bits cpu
- linux kernel 3.10+
- linux kernel cgroups and namespaces
最好是安装在centos7,因为yum的仓库docker版本比较老,直接使用清华大学的镜像
配置yum源:
# wget https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
修改
# sed -i 's@https://download.docker.com@https://mirrors.tuna.tsinghua.edu.cn/docker-ce@g' docker-ce.repo
安装
# yum install docker-ce
docker配置文件
mkdir /etc/docker #默认不存在,需要自己创建
vim /etc/docker/daemon.json
定义镜像加速器:
可以使用docker cn/阿里云加速器/中国科技大学加速器
{ "registry-mirrors": ["https://registry.docker-cn.com"] }
Daemon:
# systemctl start docker
# docker version #查看docker client和server 的version信息
# docker --help
docker 对象有images,containers,networks,volumes,plugin等对象,都可以执行增删改查操作。
# docker container --help
# docker info #查看docker详细信息
镜像
# docker search nginx
alpine:(微型发行版,小镜像,提供基础环境,不带调试工具,不建议用在生产环境)
# docker [image] pull
# docker inspect 1e1148e4cc2c #查看镜像的详细信息
容器
docker container ls # 列出正在运行的容器
docker container ls -a # 列出所有容器,包括停止运行的
docker ps 等同于docker container ls
docker [container] run
docker container stop 9a34a9f0e7d2
docker container rm 9a34a9f0e7d2
运行容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
-
-t (tty) 让docker分配一个伪终端
- -i 交互式访问
- --name 容器名称
- --network 容器网络,默认bridge。 通过docker network ls 可以查看到
- -d 运行在后台
运行一个容器:
# docker run -d --name web1 nginx:1.14-alpine
# docker run --name b1 -it busybox
/ # ls
bin dev etc home proc root sys tmp usr var
/ # httpd --help
/ # mkdir /data/html -p
/ # vi /data/html/index.html
/ # httpd -f -h /data/html/ 运行httpd
在容器外部可以访问该httpd服务,打开另一个终端:
# docker inspect b1 查看容器信息,容器ip
# curl 172.17.0.2
docker ps -a (docker container ls -a) 查看所有容器
启动已停止的容器
docker start [OPTIONS] CONTAINER [CONTAINER...]
Start one or more stopped containers
Options:
-a, --attach Attach STDOUT/STDERR and forward signals
--detach-keys string Override the key sequence for detaching a container
-i, --interactive Attach container's STDIN
# docker start -a -i b1 重新启动b1容器
停止容器
docker stop
docker kill
删除容器
docker rm b1
进入一个后台启动的容器中:
docker attach container_name/container_id
在容器中执行命令
docker container exec -it web1 /bin/sh
/ # ps
PID USER TIME COMMAND
1 root 0:00 nginx: master process nginx -g daemon off;
6 nginx 0:00 nginx: worker process
17 root 0:00 /bin/sh
23 root 0:00 ps
查看容器日志
# docker container logs 63e704e720fa
Docker Images
docker镜像中含有启动容器所需要的文件系统及其内容,因此,其用于创建并启动容器。
- 采用分层构建机制,最底层为bootfs,上面是rootfs
- bootfs: 用于系统引导的文件系统,包括bootloader和kernel,容器启动完成后会被卸载以节约内存资源
- rootfs:位于bootfs之上,表现为docker容器的根文件系统;
传统模式中,系统启动时,内核挂载rootfs时会首先将其挂载为只读模式,完整性自检完成后将其重新挂载为读写模式
docker中,rootfs由内核挂载为“只读”模式,而后通过联合“挂载技术”额外挂载一个“读写层”。
dockers image layer
- 位于下层的镜像为父镜像(parent image),最底层的为基础镜像
- 最上层为“可读写”层,其下的均为“只读”层,如果容器被删除,最上层的读写层会一并被删除
docker 分层镜像
docker分层镜像,除了aufs,还支持btrfs,devicemapper,overlay2和vfs等
Docker Registry
启动容器时,docker daemon 会试图从本地获取相关镜像,本地镜像不存在时,会从Registry中下载镜像并保存到本地。
Registry用于保存docker镜像,包括镜像的层次结构和元数据
分类:
- Sponsor Registry:第三方的registry,供客户和docker社区使用
- Mirror Registry:第三方的registry,只让客户使用
- Vendor Registry:由发布docker镜像的供应商提供的registry
- Private Registry:通过设有防火墙和额外的安全层的私有实体提供的registry
Registry(repository and index)
Repository
- 由某特定的docker镜像的所有迭代版本组成的镜像仓库
- 一个Registry可以存在多个Repository
- Repository可分为“顶层仓库”和“用户仓库”
- 用户仓库名称格式为“用户名/仓库名”
- 每个仓库可以包含多个Tag(标签),每个标签对应一个镜像。一个镜像可以有多个tag,一个tag只能属于一个镜像
Index
- 维护用户账户、镜像的校验以及公共命名空间的信息
- 相当于为registry提供了一个完成用户认证等功能的检索接口
docker registry中的镜像通常由开发人员制作,而后推送至“公共”或“私有”registry上保存,公其它人员使用,例如部署到生产环境
镜像的生成途径
- Dockerfile build
- 基于容器制作 commit
- Docker Hub automated builds
基于容器制作镜像
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
Options:
-a, --author string Author (e.g., "John Hannibal Smith <hannibal@a-team.com>")
-c, --change list Apply Dockerfile instruction to the created image 改变dockerfile指令
-m, --message string Commit message
-p, --pause Pause container during commit (default true)
例如:
docker run --name b1 -it busybox (启动一个容器)
/ # mkdir /data/html -p
/ # vi /data/html/index.html
基于容器创建镜像
docker commit -p b1
sha256:ae437fa992d9c8182cffcf60e382f8d15a44e26065871b447e2838421b9231a1
docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> ae437fa992d9 3 seconds ago 1.2MB
给镜像打标签
docker tag ae437fa992d9 abao/bbox:v0.1
docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
abao/bbox v0.1 ae437fa992d9 5 minutes ago 1.2MB
一个镜像可以打多个标签:
docker tag abao/bbox:v0.1 abao/bbox:latest
镜像创建完成后,启动容器查看
docker run --name t1 -it abao/bbox:latest
/ # ls
bin data dev etc home proc root sys tmp usr var
/ # cat data/html/index.html
查看镜像详细信息
busybox container t1可以看到t1这个镜像的详细信息
"Cmd": [ #默认执行的指令,通过构建镜像时的-c可以更改
"sh"
],
docker commit -a "abao <abao@test.com>" -c 'CMD ["/bin/httpd","-f","-h","/data/html"]' -p b1 abao/bbox:v0.2
启动镜像
docker run --name t2 abao/bbox:v0.2
可以查看到
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ea4d55c5ad60 abao/bbox:v0.2 "/bin/httpd -f -h /d…" About a minute ago Up About a minute t2
也可以通过curl访问到
docker push
docker login 先
docker push (如果不是push到docker hub,必须先打tag,tag包含服务器地址/名称空间/仓库名称:标签)
镜像的导入和导出
主机1:
docker save -o myimages.gz abao/bbox:v0.1 abao/bbox:v0.2
主机2:
docker load -i myimages.gz