Docker
Docker 是一个开源的应用容器引擎,基于 Go 语言开发。
一、特性:
-
灵活: 即使最复杂的应用程序也能容器化
-
轻量级: 容器利用并共享主机内核,在系统资源方面比虚拟机更加有效
-
可移植性: 可在本地构建,再部署到云端并在任何地方运行
-
松散耦合: 容器是高度自给自足并封装的容器,使您可以在不破坏其他容器的情况下更新或升级
-
可扩展性: 您可以在数据中心增加容器副本
-
安全: 容器会自行约束和隔离应用,而无需用户进行任何配置
二、Docker的用途
-
提供统一的环境部署
-
提供弹性的云服务
-
组建微服务架构
三、安装
Docker分为社区版(CE)和企业版(EE)。
Ubuntu
参考链接:https://docs.docker.com/install/linux/docker-ce/ubuntu/
安装:
# 更新软件源
$ sudo apt-get update
# 安装依赖包
$ sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
# 添加Docker官方的GPG key
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# 验证秘钥
$ sudo apt-key fingerprint 0EBFCD88
pub rsa4096 2017-02-22 [SCEA]
9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
uid [ unknown] Docker Release (CE deb) <docker@docker.com>
sub rsa4096 2017-02-22 [S]
# 在 Ubuntu 的软件源列表中添加Docker官方源
$ sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
# 更新软件源
$ sudo apt -y update
# 安装 Docker 引擎
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
# 将当前用户添加到Docker组
$ sudo gpasswd -a ${USER} docker
$ newgrp - docker
$ sudo chown -R `id -u`:`id -g` ~/.docker
卸载
# 删除软件本身
$ sudo apt purge docker-ce
# 删除Docker 产生的数据
$ sudo rm -rf /var/lib/docker
Docker中的基本概念
镜像(Image)
-
Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外, 还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。
-
镜像不包含任何动态数据,其内容在构建之后也不会被改变。
-
镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一
层上的 任何改变只发生在自己这层。
容器(Container)
容器的实质是进程,有自己独立的空间
容器依赖于镜像,镜像是静态的定义,容器是运行的实体,如果一个镜像有一个或多个该镜像下的容器在运行那么无法删除该镜像,需要先停止容器的运行
Docker中的基本操作
镜像操作
-
拉取镜像
$ docker pull 镜像名 # 拉取Ubuntu镜像 -
镜像的查看与查找
-
查看本地镜像
$ docker images -
查找镜像
$ docker serach 镜像名查找结果列名解析:
-
OFFICIAL: 是否为官方镜像
-
AUTONATED: 是否是自动构建
-
-
-
镜像操作命令
$ docker build ./ # dockerfile构建一个镜像
$ docker history # 查看一个镜像的历史变更
$ docker inspect 镜像名 # 查看镜像详情
$ docker image ls # 查看所有已下载的镜像列表
$ docker image prune # 删除所有未使用的镜像
$ docker pull 镜像名 # 从远程仓库拉取一个镜像
$ docker push 镜像名 # 将一个本地镜像推送到远程仓库
$ docker image rm 镜像名 # 删除一个或多个本地镜像
$ docker tag 镜像名:标签名 # 为镜像创建一个标签
容器操作
-
运行容器
由镜像创建一个新的容器并在容器内部运行终端
$ docker run -it 镜像名 /bin/bashrun命令的参数:-
-i让容器的标准输入保持打开 -
-t为容器分配 -
-d让容器进入后台运行 -
-h为容器指定一个主机名 -
--name为容器分配一个名字, 不允许重名, 默认情况下有docker引擎自动产生 -
--rm容器停止后自动删除
-
-
查看运行中的容器
$ docker ps
$ docker container ls -
查看所有容器
$ docker ps -a
$ docker container ls -a -
启动停止的容器
$ docker start 容器名或容器ID -
重启容器
$ docker restart 容器名或容器ID -
退出容器
ctrl + d或者exit;处在后台运行中的容器使用
stop命令关闭$ docker stop 容器名或容器ID
$ docker container stop 容器名或容器ID -
关闭所有容器
$ docker container prune -
查看容器中的进程
对于处在后台运行的容器,可以使用下面的命令查看容器内部的运行情况
$ docker top 容器名或容器ID -
查看容器的输出
对于处在后台运行的容器,可以使用下面的命令查看容器的日志
$ docker logs 容器名或容器ID
$ docker logs -f 容器名或容器ID # 跟踪显示 -
进入运行中的容器
$ docker attach 容器名或容器ID # 这个命令在退出时会造成容器停止
$ docker exec -it 容器名或容器ID /bin/bash # 建议使用这个命令 不会造成容器停止 -
删除容器
$ docker rm 容器名或容器ID # 删除没有运行的容器
$ docker container prune # 删除所有容器包括正在运行的容器
构建镜像
通过容器构建
当一个容器经过改动后可以将其保存为一个镜像
-
执行提交操作
$ docker commit -m '描述信息' 容器名称或ID [镜像名称:镜像Tag] -
设置名称
提交镜像时参数
[镜像名称:镜像Tag]是可选的,如果没有写那么提交的镜像名称和镜像Tag为<none>,可以使用下面命令进行修改:$ docker tag 镜像ID 镜像名:镜像Tag -
注意
使用
commit构建的镜像的大小是基础镜像加上改动的部分的大小,所以镜像会比较大,不推荐使用
commit构建镜像
通过Dockerfile构建
步骤:
-
创建文件
$ touch Dockerfile -
编辑文件
FROM ubuntu:latest
FUN apt-get update -y \
&& apt-get upgrade -y \
&& apt-get install -y python3 \
&& apt-get install -y python3-pip \
&& apt-get autoclean \
&& apt-get autoremove -
构建
$ docker build -t 镜像名:镜像Tag Dockerflie文件路径
例:
$ docker build -t pydev:1.0 ./
Dockerfile 详解
-
FROM
-
格式:
FROM xxx:xxxx -
功能: 指定以那个镜像为基础进行构建,一般以Docker官方的镜像为基础
-
-
COPY
-
格式:
COPY 源路径1 源路径2 ...... 目标路径 -
功能: 将宿主机上的文件拷到镜像中,常用来拷贝一些配置文件和一些数据文件
-
-
ADD
-
格式:
ADD 源路径1 源路径2 ...... 目标路径 -
功能: 比
COPY功能强大,COPY只能复制文件,ADD可以从网站上下载文件,然后添加到镜像中.还可以是一个压缩包,ADD可以将压缩包中的内容解压到目标路径,支持tar,gzip,bz2,xz等格式
-
-
RUN
-
格式:
RUN 命令 参数1 参数2 ...... -
功能:
-
可以执行linux命令
-
每个
RUN就是一层,Docker最多支持127层,一个镜像过多层会造成镜像体积过大
-
-
-
CMD
-
格式:
CMD 命令 参数1 参数2 ... -
功能: 用于指定默认的容器主进程的启动命令,容器不是虚拟机,仅仅是一个进程,所以容器必须有开在前台的主进程,如果将容器的进程开在后台会导致容器退出
-
-
ENTRYPOINT
-
格式
-
功能: 程序的入口点,与
CMD相似,但是更复杂,可以将容器想命令一样运行
-
-
ENV
-
格式:
ENV 变量名=变量值或ENV 变量名 变量值 -
功能: 设置容器需要的环境变量
-
-
VOLUME
-
格式:
VOLUME 路径 -
功能: 声明需要挂在的存储卷
-
-
EXPOSE
-
格式:
EXPOSE 端口1 端口2 ... -
功能: 声明当前镜像开放的端口
-
-
WORKDIR
-
格式:
WORKDIR 工作目录路劲 -
功能: 用来指定容器的工作目录
-
网络操作
容器有自己的网络环境,在一台机器上运行的多个容器默认处于一个桥接内网环境中
查看当前网络
$ docker network ls
查看网络细节
$ docker network inspect 网络名
开放端口
容器的网络环境与外界是隔离的,如果宿主机想访问Docker容器内部的网络服务,可以将宿主机端口映射到容器端口
# 将宿主机的80端口映射到容器的8000端口
$ docker run -p 80:8000 django-server
# 映射宿主机指定的ip地址和指定的端口
$ docker run -p 10.0.0.35:80:8000 django-server # 用宿主机的内网IP来进行端口映射
设置容器 IP
容器IP地址是由Docker引擎自动分配的,也可以用run --ip 添加
$ docker run --name=rds --ip=127.18.0.10 redis:latest
多容器互联
默认情况下所有运行的容器都处于同一个网络环境中,但要将不同的系统之间的网络进行隔离,需要为每个系统创建一个新的网络
# 新建一个网络
$ docker nework create -d bridge 网络名
$ docker nework create -d bridge sky
# 运行容器并加入到网络
$ docker run -it --name=容器名 --network=网路名 --ip=指定IP地址 镜像名
$ docker run -it --name=rds --network=sky --ip=172.18.0.10 redis:latest
数据存储
Docker的镜像和容器使用的底层文件系统是UFS,镜像和容器本身一般只存储程序文件,不保存动态数据(如:数据库数据,日志等),这些动态数据需要保存到数据卷中.
数据卷可以让多个容器共享数据,也可以让宿主机和容器共享数据
创建数据卷
$ docker volume create 数据卷名
使用数据卷
$ docker run -v 数据卷名:挂载路径 镜像名
# 将本地的 ./src/swiper 挂在为容器的 /opt/swiper ⽬录
$ docker run -v ./src/swiper:/opt/swiper 镜像名
# 也可以通过 `ro` 参数将⽬录设置成只读
$ docker run -v ./src/swiper:/opt/swiper:ro 镜像名
-
数据卷独立于容器之外,删除容器不会删除数据卷,如果在删除容器的同时删除数据卷可以使用
docker rm -v xxx
宿主机和容器之间的数据拷贝
-
将宿主机文件拷贝到容器
$ docker cp 宿主机文件路径 容器名:容器文件路径 -
将容器文件拷贝到宿主机
$ docker cp 容器名:容器文件路径 宿主机文件路径
apt-get 指令的clean autoclean remove autoremove 的区别
$ apt-get clean # 删除缓存中的包
$ apt-get autoclean # 删除已经卸载了的软件包的安装包
$ apt-get remove # 卸载软件包
$ apt-get autoremove # 卸载自动安转且不再使用的软件包
$ apt-get purge # 卸载并清除软件包的配置

浙公网安备 33010602011771号