Docker
- 初识 Docker
- 安装
- 第一次运行
- 运行详解:
- 仓库
- 本地计算机可以拉取dockerhub上的镜像
- 本地计算机的镜像可以推送到dockerhub的账户内
- 镜像
- 概念
- 特点
- 运行
- 创建
- 手动创建
- 脚本创建
- 容器
- 概念
- 特点
- 运行
- 再次打开已关闭的容器
- 使用约束
- Docker vs 虚拟机
- Dockerfile编写
- 编写思路
- Dockerfile指令
- 常用docker命令
- Docker镜像(加快pull速度)
初识 Docker
Docker是实现容器技术的软件,用到了Linux内核的命名空间原理,故docker最适合在Linux上运行,现在能在Windows和Mac上运行是借助虚拟化技术创建Linux虚拟机实现的。
Docker有三个核心概念:容器、镜像、仓库
安装
#执行脚本简易安装 curl是用来发送http请求的,是利用URL语法在命令行下工作的文件传输工具
$ sudo apt-get install curl
$ curl -sSL https://get.daocloud.io/docker | sh
$ systemctl start docker
#修改添加当前用户到docker用户组,修改socket权限
$ sudo usermod -aG docker dev
$ sudo chmod 777 /var/run/docker.sock
#退出终端后再次进入测试命令
$ docker --help
第一次运行
$ docker run hello-world
运行详解:
The Docker client contacted the Docker daemon. # 命令行连接到守护进程
The Docker daemon pulled the "hello-world" image from the Docker Hub (amd64) # 守护进程发现当前没有hello-world镜像,于是去dockerhub下载了一个镜像
The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. # 守护进程基于hello-world镜像创建了一个容器,容器内有一个可执行程序,现在的内容都是由该程序输出的。
The Docker daemon streamed that output to the Docker client, which sent it to your terminal. # 守护进程将容器的输出发送给命令行,也就是当前终端。
仓库
Docker官方设立了一个Docker镜像仓库:dockerhub,登录注册一个账号获得个人的repository
本地计算机可以拉取dockerhub上的镜像
#完整的docker镜像名称是 作者/镜像名:标签 如$ docker pull ubuntu/ubuntu:latest 拉取ubuntu账号下的最新版本的ubuntu
$ docker pull ubuntu:latest #这里不写作者,不用登陆即可下载
若想拉取其他镜像如centos,可以在dockerhub上先搜索centos
进入官方页面之后,可以搜索tag来找到特定的版本,比如我搜索7.5
本地计算机的镜像可以推送到dockerhub的账户内
#登录,按照提示输入dockerhub的用户名密码
$ docker login
# 将本地镜像重命名成规范名称
$ docker tag ubuntu marklion/ubuntu:myfirsttag
# 推送自己的镜像
$ docker push marklion/ubuntu:myfirsttag
镜像的修改,提交等操作很类似git和github的操作。
镜像
概念
一组环境的静态集合,类似操作系统镜像。
特点
docker镜像像有分层依赖的关系。创建镜像的过程就好像写代码,从简单到复杂的过程。
运行
镜像运行后会产生容器。基于一个镜像可以运行多个容器。
#查看当前所有的镜像
$ docker images
#运行ubuntu镜像:在ubuntu容器中执行一条ls的命令,不写命令则运行bash
$ docker run --rm -ti ubuntu ls
# --rm:运行结束后删除容器 -ti:提供虚拟终端和交互式界面
创建
类似基于原始系统搭环境
手动创建
a.下载并运行基础镜像
b.进入基础镜像的容器内安装所需环境
c.将容器提交为镜像
# 直接执行ifconfig,报错,因为基础镜像没有安装ifconfig包
$ docker run --rm ubuntu ifconfig
docker: Error response from daemon: OCI runtime create failed: container_linux.go:344: starting container process caused “exec :\"ifconfig\"
ERRO[0000] error waiting for container: context canceled
# 进入基础镜像.安装工具包后退出
$ docker run -ti ubuntu
# apt-get update
# apt-get install -y net-tools
# exit
# 找到刚才的容器,基于其创建镜像
$ docker ps -a
CONTAINER ID IMAGE C0W4AND CREATED STATUS PORTS NAME
034abada670c ubuntu "/bin/bash" 31 minutes ago Exited (0) 20 seconds ago
# commit命令用于容器--->镜像。 容器ID可以用简写
$ docker commit 034a my_ubuntu:add_net
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
my_ubuntu add_net 6ca02b1d0483 5 seconds ago 114MB
# 用新镜像运行ifconfig
$ docker run --rm my_ubuntu:add ifconfig
# 成功运行
脚本创建
a.编写Dockerfile
b.运行docke编译命令
# Dockerfile中定义基础镜像,和要运行的安装命令
$ cat Dockerfile
FROM ubuntu
RUN apt-get update
RUN apt-get install -y net-tools
# 编译镜像,指定镜像名是df_unbutu:add_net,指定Dockerfile所在目录是当前目录
$ docker build -t df_unbutu:add_net .
容器
概念
运行中的一组环境。基于某个镜像创建。
特点
容器中要运行程序,最好只运行一个程序。容器的运行不会影响镜像内容。
运行
- -d支持以后台模式运行进程
$ docker run -d ubuntu # -d后台模式运行容器
- -p支持将容器内的端口映射到宿主机
docker run -p 80:80 -v /data:/data -d nginx:latest
- -v支持以挂载(mount)的形式和宿主机共享文件系统
docker run -p 80:80 -v /data:/data -d nginx:latest
- 容器运行的程序
exit
退出后,容器随之退出,当然,容器退出后可以再次打开
再次打开已关闭的容器
# 找到需要重启的容器的container ID
$ docekr ps -a
# 重启container
$ docker start xxxx
# 打开容器
$ docekr attach xxxx
使用约束
- docker官方推荐,一个容器最好只运行一个进程
- 镜像和容器会占用磁盘空间,好习惯:删除不用的容器和镜像。
Docker vs 虚拟机
相似:
- 都通过镜像包装
- 都起到隔离运行环境的作用
区别:
- | Docker | 虚拟机 |
速度 | 快(基于当前系统创建不同上下文) | 慢(启动操作系统) |
体量 | 小(镜像自由剪裁) | 大(依赖厂商) |
分发 | 容易(dockerhun、Dockerfile) | 困难(依赖厂商分发) |
复杂度 | 简单(对于操作系统只是一个程序) | 复杂(要考虑资源的分配、与宿主机通信等) |
独立性 | 较好(只能基于端口独立) | 非常好(跟真实主机几乎无区别) |
Dockerfile编写
编写思路
- 确定基础镜像
- 安装所需环境
- 定义执行点
Dockerfile如下:
FROM ubuntu
RUN apt-get update
RUN apt-get install -y gcc
ENTRYPOINT ["gcc"]
注意:有几个RUN就会有几层镜像,镜像层次过多会膨胀过大,可以如下通过\ 和 &&
只构建一层镜像:
FROM ubuntu
RUN apt-get update \
&& apt-get install -y gcc
ENTRYPOINT ["gcc"]
构建镜像
$ docker build -t my_gcc
运行镜像
# 由于Dockerfile中设置了执行点是gcc,所以镜像my_gcc后面所有内容都是gcc参数
$ docker run -v /home/dev/:/root/host/ my_gcc /root/host/tcp_echo.c -o /root/host/tcp_echo
Dockerfile指令
指令 | 描述 |
FROM 本地镜像名或者dockerhub镜像名 | 指定基础镜像 |
MAINTAINER 作者<邮箱> | 注明作者和邮箱 |
COPY 主机文件路径 容器内路径 | 复制指令,从上下文目录中复制文件或者目录到容器里指定路径,主机文件路径必须使用dockerfile所在路径的相对路径 |
RUN 命令 | 构建镜像过程中执行的命令,一条构建一层镜像 |
EXPOSE 端口号 | 定义要映射到主机的端口号,搭配run命令的-P参数可以随机映射 |
ENTYRPOINT | 定义镜像执行点,定义后,run命令最后的字段会变成该执行点的参数 |
CMD [“命令或参数”] | 若没有定义执行点,则该命令定义的是镜像创建后缺省的指向程序。若定义了执行点,则该命令定义的是执行点的参数。run命令的最后字段会替换该命令的值。 |
常用docker命令
$ docker images # 查看本地docker仓库中的镜像情况
$ docker ps -a # 列出正在运行的容器 -a包括未运行的
$ docker run -ti ubuntu /bin/bash # -ti是启动一个伪输入终端并以交互模式运行
$ docker run -d ubuntu # -d后台模式运行容器
https://www.runoob.com/docker/docker-run-command.html
Docker镜像(加快pull速度)
{
“registry-mirrors”: [
“https://9cpn8tt6.mirror.aliyuncs.com”,
“https://8bhew391.mirror.aliyuncs.com”,
“https://almtd3fa.mirror.aliyuncs.com”,
“https://hccwwfjl.mirror.aliyuncs.com”,
“https://registry.docker-cn.com”,
“http://hub-mirror.c.163.com”
]
}
写入/etc/docker/daemon.json
systemctl daemon-reload
systemctl restart docker