Docker入门笔记
Docker简介
- Docker之所以发展如此迅速,也是因为它对此给出了一个标准化的解决方案—–系统平滑移植,容器虚拟化技术。
- 环境配置相当麻烦,换一台机器,就要重来一次,费力费时。很多人想到,能不能从根本上解决问题,软件可以带环境安装?也就是说,安装的时候,把原始环境一模一样地复制过来。开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题。
- Docker的出现使得其得以打破过去「程序即应用」的观念。透过镜像将作业系统核心除外,运作应用程式所需要的系统环境,由下而上打包,达到应用程式跨平台间的无缝接轨运作。
- Docker是基于Go语言实现的云开源项目。
- Linux容器技术的出现就解决了这样一个问题,而 Docker 就是在它的基础上发展过来的。将应用打成镜像,通过镜像成为运行在Docker容器上面的实例,而 Docker容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作。
- 总结就是,Docker解决了运行环境和配置问题的软件容器, 方便做持续集成并有助于整体发布的容器虚拟化技术。
安装
前提
- Docker支持以下的CentOS版本:
- Docker运行在CentOS7上,要求系统为64位、系统内核版本为3.8以上。
- Docker运行在CentOS-6.5或更高的版本的CentOS上,要求系统为64位、系统内核版本为2.6.32-431或者更高版本。
三要素
- 镜像
- Docker 镜像(Image)就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。
- docker镜像文件类似于Java的类模板,而docker容器实例类似于java中new出来的实例对象。
- 容器
- 容器是用镜像创建的运行实例
- 容器为镜像提供了一个标准的和隔离的运行环境,它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台
- 可以把容器看做是一个简易版的 Linux 环境
- 仓库
- 仓库是集中存放镜像文件的场所。
- 仓库分为公开仓库和私有仓库两种形式。最大的公开仓库是 Docker Hub(https://hub.docker.com/),%EF%BC%8C)
开始安装
官方文档:http://xn--https-pja//docs.docker.com/engine/install/centos/
虚拟机联网
安装gcc
1
[root@hadoop1 ~]# yum -y install gcc
安装gcc-c++
1
[root@hadoop1 ~]# yum -y install gcc-c++
安装yum-utils
1
[root@hadoop1 ~]# yum install -y yum-utils
设置stable镜像仓库(这里使用阿里云镜像)
1
[root@hadoop1 ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装docker
1
[root@localhost etc]# yum -y install docker-ce docker-ce-cli containerd.io
启动docker
1
[root@localhost /]# systemctl start docker
查看版本
1
[root@localhost /]# docker version
运行
1
[root@localhost /]# docker run hello-world
镜像加速
注册/登录阿里云账户:https://promotion.aliyun.com/ntms/act/kubernetes.html
首页->控制台->容器镜像服务,并复制加速地址,根据下方版本提示复制命令运行进行配置即可
运行
对比
常用命令
基础命令
1 | 启动docker: systemctl start docker |
镜像命令
查看本地所有镜像
1
docker images
显示的表中名称意义
1
2
3
4
5REPOSITORY:表示镜像的仓库源
TAG:镜像的标签版本号
IMAGE ID:镜像ID
CREATED:镜像创建时间
SIZE:镜像大小OPTIONS说明:
1
2
3
4
5REPOSITORY:表示镜像的仓库源
TAG:镜像的标签版本号
IMAGE ID:镜像ID
CREATED:镜像创建时间
SIZE:镜像大小
去总库查询相关镜像
1
2
3
4
5docker search [OPTIONS] 镜像名字 某个镜像名字
OPTIONS说明:
--limit : 只列出N个镜像,默认25个
例子:
docker search --limit 5 redis下载镜像
1
docker pull 镜像名字[:TAG]
- 说明:tag为版本号,默认为最新版
查看空间占用情况
1
docker system df #查看镜像/容器/数据卷所占的空间
删除本地镜像
1
docker rmi -f 镜像ID/名字:tag
docker虚悬镜像
1 | 仓库名、标签都是<none>的镜像,俗称虚悬镜像 |
容器命令
拉取一个镜像
1
[root@localhost ~]# docker pull ubuntu
构建容器
1
docker run [OPTIONS] 镜像名 [COMMAND] [ARG...]
OPTIONS说明:
1
2
3
4
5
6--name="容器新名字" #为容器指定一个名称
-d #后台运行容器并返回容器ID,也即启动守护式容器(后台运行)
-i #以交互模式运行容器,通常与 -t 同时使用
-t #为容器重新分配一个伪输入终端,通常与 -i 同时使用;也即启动交互式容器(前台有伪终端,等待交互)
-P #随机端口映射,大写P
-p #指定端口映射,小写p举例
1
[root@localhost ~]# docker run -it ubuntu /bin/bash
退出容器
1
exit
启动容器
1
docker start 容器ID或者容器名
停止容器
1
docker stop 容器ID或者容器名
删除容器
1
docker rm 容器ID
查看运行中的容器
1
2
3
4
5
6
7docker ps [OPTIONS]
OPTIONS说明:
-a :列出当前所有正在运行的容器+历史上运行过的
-l :显示最近创建的容器。
-n:显示最近n个创建的容器。
-q :静默模式,只显示容器编号。
[root@localhost ~]# docker ps从容器内拷贝文件到主机上
1
docker cp 容器ID:容器内路径 目的主机路径
export 导出容器的内容留作为一个tar归档文件
1
docker export 容器ID > 文件名.tar
import 从tar包中的内容创建一个新的文件系统再导入为镜像
1
cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号
重要
有镜像才能创建容器,这是根本前提
Docker容器后台运行,就必须有一个前台进程,否则会自行销毁
前台交互式启动
1
docker run -it redis:6.0.8
后台守护式启动
1
docker run -d redis:6.0.8
查看容器日志
1
docker logs 容器ID
查看容器内运行的进程
1
docker top 容器ID
进入正在运行的容器并以命令行交互
1
docker exec/attach -it 容器ID bashShell
- exec 是在容器中打开新的终端,并且可以启动新的进程 用exit退出,不会导致容器的停止。(推荐)
- attach 直接进入容器启动命令的终端,不会启动新的进程 用exit退出,会导致容器的停止。
镜像
介绍
镜像是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好形成一个可交付的运行环境,这个运行环境就是image镜像文件。
分层的镜像
UnionFS(联合文件系统)
Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。
UnionFS是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
Docker镜像加载原理
- docker的镜像实际上由一层一层的文件系统组成(UnionFS)
- bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是引导文件系统bootfs。
- rootfs (root file system) ,在bootfs之上。包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。 对于不同的linux发行版, bootfs基本是一致的, rootfs会有差别, 因此不同的发行版可以公用bootfs。
- 镜像分层最大的一个好处就是共享资源,方便复制迁移,就是为了复用。
commit
docker commit提交容器副本使之成为一个新的镜像
1
docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]
例子
原始的默认Ubuntu镜像是不带着vim命令的
执行
1
2apt-get update #更新包管理工具
apt-get -y install vim #安装vim安装完成后,commit新镜像
Docker中的镜像分层,支持通过扩展现有镜像,创建新的镜像。
提交镜像到阿里云库
进入https://promotion.aliyun.com/ntms/act/kubernetes.html,进入控制台并创建个人实例
创建命名空间
创建本地仓库
根据生成的提示,复制命令到Linux中运行
Docker私有库
下载镜像Registry
1
docker pull registry
运行私有库Registry,相当于本地有个私有Docker hub
修改符合私服规范的Tag
修改配置文件使之支持http
push推送到私服库
1
docker push ip:port/id:tag
Docker容器数据卷
Docker挂载主机目录访问如果出现cannot open directory .: Permission denied,解决办法:在挂载目录后多加一个--privileged=true
参数即可
卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性:卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷
将运用与运行的环境打包镜像,run后形成容器实例运行 ,但是我们对数据的要求希望是持久化的
将docker容器内的数据保存进宿主机的磁盘中
运行一个带有容器卷存储功能的容器实例
1
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
容器和宿主机之间数据共享
读写规则映射添加说明
- 读写(默认):rw
- 只读:ro
卷的继承和共享
容器1完成和宿主机的映射
1
docker run -it --privileged=true -v /mydocker/u:/tmp --name u1 ubuntu
容器2继承容器1的卷规则
1
docker run -it --privileged=true --volumes-from 父类 --name u2 ubuntu
常用镜像安装
tomcat
dockerhub上面查找tomcat镜像
也可通过
docker search tomcat
搜索相关镜像拉取镜像
1
docker pull tomcat
运行镜像并构建容器
1
[root@localhost ~]# docker run -d -p 8080:8080 --name t1 tomcat
- 注:新版tomcat可能会出现访问首页404的问题(没有映射端口或者没有关闭防火墙),解决方案:
- 先成功启动tomcat
- 进入命令行窗口
[root@localhost ~]# docker exec -it 1e843aca6059 bash
- 查看目录
ls -l
,发现有webapps
和webapps.dist
两个文件夹,需要将webapps
删除,将webapps.dist
命名为webapps
- 删除
webapps
:rm -r webapps
- 重命名:
mv webapps.dist webapps
- 此时即可访问
localhost:8080
端口
- 注:新版tomcat可能会出现访问首页404的问题(没有映射端口或者没有关闭防火墙),解决方案:
可安装免修改的tomcat8
1
2docker pull billygoo/tomcat8-jdk8
docker run -d -p 8080:8080 --name mytomcat8 billygoo/tomcat8-jdk8
mysql
- docker安装完MySQL并run出容器后,建议请先修改完字符集编码后再新建mysql库-表-插数据
redis
拉取镜像
1
docker pull redis:6.0.8
在宿主机下新建目录
/app/redis
1
mkdir -p /app/redis
将一个redis.conf文件模板拷贝进/app/redis目录下
1
cp /etc/redis.conf /app/redis/
修改redis.conf
- 允许redis外地连接 必须注释掉
bind 127.0.0.1
- 将
daemonize yes
注释起来或者daemonize no
设置,因为该配置和docker run中-d参数冲突,会导致容器一直启动失败 - 开启redis数据持久化 appendonly yes 可选
- 允许redis外地连接 必须注释掉
创建容器
1
docker run -p 6379:6379 --name myr3 --privileged=true -v /app/redis/redis.conf:/etc/redis/redis.conf -v /app/redis/data:/data -d redis:6.0.8 redis-server /etc/redis/redis.conf
测试连接
1
docker exec -it 711a23222ef4 redis-cli