Docker
忘记是自己整理的还是搬别人的了,挂上来备忘一下,有需要再补充
1.什么是Docker
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。可以让开发者打包他们的应用以及依赖包到一个轻量级可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
一个CentOS的基础镜像仅170M
一个宿主机理论可部署100+的容器
1.1 三大重要概念
sql
容器三大基本概念
镜像 image
容器 container
仓库 repository
docker整个生命周期就是这三个概念.
1.1.1Docker镜像(image)
Docker镜像就是一个只读的模板.
例如:一个镜像可以包含一个完整的CentOS操作系统环境,里面仅安装了Apache或用户需要的其他应用程序.
镜像可以用来创建Docker容器.
Docker提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用.
1.1.2image的分层存储
因为镜像包含完整的root文件系统,体积是非常庞大的,因此docker在设计时按照Union FS的技术,将其设计为分层存储的架构.
镜像不是ISO那种完整的打包文件,镜像只是一个虚拟的概念,他不是一个完整的文件,而是由一组文件组成,或者多组文件系统联合组成.
1.1.3Docker容器(container)
image和container的关系,就像面向对象程序设计中的类和实例一样,镜像是静态的定义(class),容器是镜像运行时的实体(object).
容器可以被创建、启动、停止、删除、暂停
Docker利用容器来运行应用.
容器是从镜像创建的运行实例.它可以被启动、开始、停止、删除。每个容器都是相互隔离的,保证安全的平台.
可以把容器看做是一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序.
注意:镜像是只读的,容器在启动的时候创建一层可写层作为最上层.
1.1.4Docker仓库(repository)
仓库是集中存放镜像文件的场所.有时候把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分.实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag).
仓库分为公开仓库(Public)和私有仓库(Private)两种形式.
最大的公开仓库是Docker Hub,存放了数量庞大的镜像供用户下载.国内的公开仓库包括Docker Pool等,可以提供大陆用户更稳定快读的访问.
当用户创建了自己的镜像之后就可以使用push命令将它上传到公有或者私有仓库,这样下载在另外一台机器上使用这个镜像时候,只需需要从仓库上pull下来就可以了.
注意:Docker仓库的概念跟Git类似,注册服务器可以理解为GitHub这样的托管服务.
1.2 Doker能做什么
-
Web 应用的自动化打包和发布。
-
自动化测试和持续集成、发布。
-
在服务型环境中部署和调整数据库或其他的后台应用。
-
从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。
1.3 Docker的优势
更高效的利用系统资源
由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker对系统资源的利用率更高.
无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效.因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用.
1.3.1更快速的启动时间
传统的虚拟机技术启动应用服务往往需要数分钟,而Docker容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间.大>大的节约了开发、测试、部署的时间.
1.3.2一致的运行环境
开发过程中一个常见的问题是环境一致性问题.由于开发环境、测试环境、生产环境不一致,导致有些bug并未在开发过程中被发现.
而Docker的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现
这段代码在我机器上没问题啊
这类问题.
1.3.3持续交付和部署
对开发和运维(DevOps)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行.
使用Docker可以通过定制应用镜像来实现持续集成、持续交付、部署.开发人员可以通过Dockerfile来进行镜像构建,并结合持续集成(Continuous Integration)系统进行集成测试,
而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合持续部署(Continuous Delivery/Deployment)系统进行自动部署.
而且使用Dockerfile使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像.
1.3.4更轻松的迁移
由于Docker确保了执行环境的一致性,使得应用的迁移更加容易.Docker可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的.
因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况.
2.Docker的安装
CE(Community Edition: 社区版)
2.1. 卸载旧版本
shell
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2.2.安装依赖软件包
shell
sudo yum install -y yum-utils
2.3.设置镜像仓库
默认国外可能比较慢:
shell
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
可以使用阿里云镜像安装:
shell
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
2.4. 安装Docker CE
Docker有两个分支版本:Docker CE和Docker EE,即社区版和企业版,因为企业版需要官方授权,所以我们一般用社区版。
shell
sudo yum install docker-ce docker-ce-cli containerd.io
2.5. 启动Docker
shell
sudo systemctl start docker
2.6. 验证是否正确安装了安装Docker CE
通过运行hello-world 映像来验证是否正确安装了Docker Engine 。
shell
sudo docker run hello-world
此命令下载测试图像并在容器中运行它。容器运行时,打印出Hello from Docker!说明安装成功。
3.Docker 常用命令
3.1 镜像管理
shell
查看镜像列表:
docker images
docker image ls
导出镜像:
docker image save centos > docker-centos6.9.tar.gz 导入镜像:
docker image load -i docker-centos6.9.tar.gz
删除镜像:
docker image rm centos:latest docker image rm 578c3
搜索镜像
docker search + 镜像名字
给源中镜像打标签:
docker tag nginx:latest 10.0.0.11:80/nginx:latest
推送指定镜像到docker镜像源服务器
docker push 10.0.0.11:80/nginx:latest
获取镜像 (下载)
docker pull image_name
官方pull
docker pull centos:6.8(没有指定版本,默认会下载最新版) 私有仓库pull docker pull daocloud.io/huangzhichong/alpine-cn:latest
docker history image_name 显示一个镜像的历史
docker build -t <image-name> . *(点一定不能去掉)#使用当前目录下的Dockerfile构建镜像
3.2 容器管理
shell
docker -v #查看版本
docker info #查看docker信息
运行容器
docker run --name 容器名 -d -p 3306:3306 mysql docker 启动容器
docker run image_name
docker run -d -p 80:80 nginx:latest
run(创建并运行一个容器)
-d 放在后台
-p 端口映射 :docker的容器端口
-P 随机分配端口
-v 源地址(宿主机):目标地址(容器)
docker run -it --name centos6 centos:6.9 /bin/bash
-it 分配交互式的终端
--name 指定容器的名字
/bin/sh覆盖容器的初始命令
docker run image_name 启动容器***
docker stop container_id 停止容器
docker kill container_name 杀死容器
docker ps (-a -l -q) 查看容器列表
docker container rm `docker ps -a -q` 删除所有容器
docker rm -f `docker ps -a -q` #删除所有容器
docker ps -a #查看容器列表
docker exec -it 77cd6bef4dc9 /bin/bash #进容器
docker start/stop container-id||container-name 开启/停止 指定容器id或者容器名称的容器
docker run -d -p 80:80 -v /opt/xiaoniao:/usr/share/nginx/html nginx:latest
docker logs container-name/container-id #查看容器日志
docker ps | grep ${CONTAINER_ID} #查看容器状态
docker commit ID new_image_name #镜像打包 (保存对容器的修改)
docker commit -m="提交的描述信息" -a="作者" 容器id 要创建的目标镜像名:[标签名]
docker inspect <id/container_name> #查看容器内部详情细节
docker login #登录
Ctrl+P+Q #退出而不关闭容器
docker rename name1 name2 容器改名
docker exec -it kafka /bin/bash 进入指定容器
3.3 其他命令docker-compose 的一些用法
shell
docker-compose up -d 用docker-compose.yml启动镜像
systemctl start docker 启动docker
systemctl stop docker 关闭docker
更新操作:
docker 进入容器命令 sudo docker exec -it 容器id /bin/bash 前后端的包名都有修改 关闭docker-compose
[java@zhongtaibu docker]$ docker-compose down
重构docker-compose镜像
[java@zhongtaibu docker]$ docker-compose build
重启
[java@zhongtaibu docker]$ docker-compose up -d
## 4.Docker使用中的一些东西
创建kafka主题
```shell
kafka-topics.sh --create --zookeeper dockerflink_zookeeper_1:2181 --replication-factor 1 --partitions 1 --topic mydemo
补充:
Linux安装docker
限制
CentOS 64位 6.5+
查看CentOS 内核版本
cat /etc/redhat-release
参考文档:
https://developer.aliyun.com/article/110806
CentOS 6.x 安装docker
yum install -y epel-release
yum install -y docker-io
安装后的配置文件
/etc/sysconfig/docker
启动Docker后台服务
service docker start
验证
docker version
CentOS 7.x 安装docker
yum install -y yum-utils
// 官方源: yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum-config-manager --add-repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
yum install docker-ce docker-ce-cli containerd.io
启动Docker后台服务
systemctl enable docker
systemctl start docker
验证
docker version
镜像加速
参考文档:
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
常用命令
docker version
镜像
docker images 列出本地的镜像列表
docker search XXX 根据镜像名称,远程查询镜像
docker pull name:tag 下载镜像
docker rmi id/name 删除某个镜像
docker rmi -f id/name 删除某个镜像(强制删除)
实例
docker run --name 容器名称 -d -p 8080:8080 -v /usr/local/tomcat/webapps/ROOT:/usr/local/project/ tomcat:8
docker ps 列出正在运行的实例
docker ps -a 列出所有实例
docker start id/name 启动实例
docker stop id/name 停止实例
docker exec -it e9410ee182bd /bin/sh 进入实例内部
docker logs -f id/name 查看容器启动日志
docker inspect id/name 查看容器内部详情
docker rm id/name 删除某个容器
docker top id/name 查看容器内的进程
将正在运行的实例,封装成镜像
docker commit -m="提交的描述信息" -a="作者" 容器id 要创建的目标镜像名:[标签名]
Dockerfile
docker build -f Dockerfile绝对路径 -t 要创建的目标镜像名:[标签名] .
本项目
1.使用BaseDockerfile创建基础的镜像
docker build -f /temp/test/BaseDockerfile -t supervision/centos7 .
#运行测试
docker run --name mycentos -d -it supervision/centos7 /bin/bash
2.项目打包成jar文件
3.根据Dockerfile为本项目打包成镜像
#构建docker
docker build -f Dockerfile -t supervision/web .
#运行
docker run --name web -d -p 8080:8080 \
-v /root/test/logs:/alidata/logs \
-v /root/test/config:/alidata/config \
-v /root/test/upload:/alidata/upload \
--restart=always \
--privileged \
supervision/web
限制:
如果/alidata/config挂载到了宿主机,则宿主机上此文件夹下必须先准备好配置文件
docker mysql8.0安装
1.安装前准备
1.1禁用selinux
shell
$ vi /etc/sysconfig/selinux
# 改为
SELINUX=disabled
$ setenforce 0
1.2 查看iptables
2.安装
shell
docker pull mysql:8.0
docker run --name=mysql8.0 -e MYSQL_ROOT_PASSWORD=root -p 3308:3306 -v /alidata/mysql8:/var/lib/mysql -d mysql:8.0
3.初始化root远程账号
shell
docker exec -it mysql1 mysql -uroot -p
ALTER USER 'root'@'%' IDENTIFIED BY 'password';
flush privileges;
4 故障排查
- 容器启动报错 (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport]
解决办法:systemctl restart docker