Docker
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
Docker 里面三个核心词汇,镜像、容器、仓库。
1、Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker 。通过 uname -r 命令查看你当前的内核版本
uname -r
centos版本 3.10.0-514.el7.x86_64
2、初步安装和启动docker
yum update -y
yum -y install docker
systemctl start docker
3、设置镜像
vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://aj2rgad5.mirror.aliyuncs.com"]
}
####docker 命令
docker images
#列出所有镜像docker run ...
# 运行容器docker ps ...
#查看正在运行的容器docker exec it(编号) bash
进入运行的容器docker stop [NAME]/[CONTAINER ID]
:将容器退出。docker kill [NAME]/[CONTAINER ID]
:强制停止一个容器。docker rm [NAME]/[CONTAINER ID]
:不能够删除一个正在运行的容器,会报错。需要先停止容器。netstat -na|grep 8080
: 查看端口是否占用docker run -d -p 8080:80 hub.c.163.com/library/nginx
将程序映射到端口docker run -d -P hub.c.163.com/library/nginx
容器中的所有端口映射到主机随机端口
docker 镜像删除
1.停止所有的container,这样才能够删除其中的images:
docker stop $(docker ps -a -q)
如果想要删除所有container的话再加一个指令:
docker rm $(docker ps -a -q)
2.查看当前有些什么images
docker images
3.删除images,通过image的id来指定删除谁
docker rmi <image id>
想要删除untagged images,也就是那些id为的image的话可以用
docker rmi $(docker images | grep "^<none>" | awk "{print $3}")
要删除全部image的话
docker rmi $(docker images -q)
docker rmi -f $(docker images -q [imageid/imagename] | sort -u)
删除多个同id的镜像这里写代码片
运行springboot
Dockerfile
FROM hub.c.163.com/library/java:openjdk-8-jdk-alpine
VOLUME /tmp
ADD eureka-server_01-0.0.1-SNAPSHOT.jar app.jar
RUN sh -c 'touch /app.jar'
ENV JAVA_OPTS=""
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
docker 推送镜像到仓库
docker login hub.c.163.com
登录网易云基础服务私有镜像仓库
docker tag test/centos:6.5 hub.c.163.com/dangernear/centos:6.51
修改镜像标签信息
docker push hub.c.163.com/dangernear/centos:6.51
将新镜像上传至私有镜像仓库
https://www.163yun.com/help/documents/68510213955833856
Dockerfile 语法
FROM # 基础镜像
MAINTAINER # 谁写的
RUN # 镜像构建的时候需要执行的命令
ADD # 会自动解压
WORKDIR # 镜像的工作目录
VOLUME # 挂载目录
EXPOSE # 保留端口配置
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效, 可被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令 ,可以追加指令
ONBUILD # 当构建一个被继承的dockerFile 这时候会运行该命令。触发指令
COPY # 类似ADD , 将文件拷贝到镜像中
ENV # 构建的时候设置环境变量
Dockerfile Volume与docker -v的区别:
Dockerfile中声明了匿名卷但是run的时候没有使用 -v绑定匿名卷的话那么docker就会在/var/lib/docker/volumes这个目录下创建一个目录来绑定匿名卷。
docker run -itd -name redis1 -v /data:/share/data image-redis
//运行一个容器并且将当前机器的/data目录绑定到容器的匿名卷中
docker build -f [dockerfile] -t [name:version] #创建docker
docker exec it [id] /bin/bash . # 进入运行的docker
Dockerfile 文件
FROM docker.io/majiajue/jdk1.8
MAINTAINER panlei315@live.cn
VOLUME /opt/docker/data
ADD user-0.0.1-SNAPSHOT.jar /user.jar
ENTRYPOINT ["java","-jar","/user.jar"]
docker create --name=myjava 创建一个容器
生命周期图:
指令图:
Docker 网络
docker 使用的是网络桥接( veth-pair),宿主是docker0的一个网桥
所有容器都不指定网络的情况下, 都是通过docker0路由的,docker0 会给容器分配一个默认可用的IP
– link
当我们编写一个微服务,dburl=ip,项目不重启,ip 换掉了,我们希望可以处理这个问题,可以通过名字进行访问吗?
docker run -d -P --name tomcat2 --link tomcat3 tomcat
这样在tomcat2容器中通过ping tomcat3
就可以连接了,缺陷是tomcat3访问不到tomcat2,现已不支持使用,可通过自定义网络的形式实现这种效果
查看docker 内部详细参数可以用docker inspect
自定义docker网络:
docker network ls #查看docker所有网络
# 创建一个自己的网络
docker network create --driver brige --subnet 192.168.0.1/16 --gateway 192.168..0.1 mynet
# 通过mynet 运行一个docker 容器
docker run -d -P --name tomcat-net-01 --net mynet tomcat
rancher 安装
sudo docker run -d --restart=always -p 8888:8080 rancher/server
rancher安装
三刷
docker
安装:
文档:https://docs.docker.com/engine/install/
1、卸载历史版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2、初始化docker依赖
sudo yum install -y yum-utils
3、指定yum 源
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
#推荐使用阿里云源
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4、安装最新版本docker
sudo yum install docker-ce docker-ce-cli containerd.io
5、选择安装版本(非必须)
yum list docker-ce --showduplicates | sort -r
docker-ce.x86_64 3:18.09.1-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.0-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.1.ce-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.0.ce-3.el7 docker-ce-stable
# 指定版本
sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
6、启动
sudo systemctl start docker
# 运行一下命令就安装成功
sudo docker run hello-world
容器命令
docker run image
# 参数说明
--name="Name" 容器名字 tomcat01 tomcat02
-d 后台方式挂起
-it 使用交互方式运行,进入容器查看内容
-p 指定容器端口 -p 8080:8080
-P 随机指定端口
# 启动容器并进入
docker run -it centos /bin/bash
exit #退出容器,容器停止
ctrl + Q + P #退出容器,容器不停止
查看日志
# 查看全部日志
docker logs -tf e866fe9899c6
# 查看 指定条数日志
docker logs -tf --tail 10 e866fe9899c6
2020-11-05T00:44:32.485251000Z 1:M 05 Nov 2020 00:44:32.484 * DB saved on disk
2020-11-05T00:44:32.502602000Z 1:M 05 Nov 2020 00:44:32.502 * DB saved on disk
# 查看进程
docker top [容器ID]
# 查看镜像元数据
docker inspect [容器ID]
docker 复制
# 从容器内拷贝文件到主机
docker cp [容器ID]:[容器内路径] [目的主机路基]
docker cp e866fe9899c6:/home/helloword.java /data
查看docker内存
docker stats
commit
docker commit 提交容器成为一个新的镜像
docker commit -a="作者" -m="提交的描述信息" [容器id] [目标镜像名]:[tag]
docker commit -a="pl" -m="tomcat" e866fe9899c6 tomcat2:2.1
容器数据卷
# 直接用命令挂载
docker run -it -v [主机目录]:[容器目录] [镜像名称] /bin/bash
docker run -it -v /home/data/test:/home tomcat /bin/base
# 可以通过docker inspect 方式查看
# 查看挂载卷
docker volume ls
DRIVER VOLUME NAME
local 05003b8e1729f465bd48dd4630d06d64c4c4fdfa66a59e1904f670d3ec9c5c1d
local 13c591f66f248b71ac4d4bc6dc6ac71f48bd4ef1ee049748f150449077d97953
local 17520c3bd146321927a4fb344d8bd8652b1bfff0dda13308abe3483be78deb1a
local 1bd5246ecac396744651f02b7ac97631ee611a2630975f6824828f5695ee8668
local 2638ecc9c3cfb867de4425c7795d1b5b64a3ccefc6d63b44c3bd1f386c1f276c
local 38bf71ad3614850484f4ba9c88361f473276afa5bd08c44a52c62a346c1b7e34
local 3d66d67322218f53883fe6139b1b19098e38462a7dd24b6f9e1d0f3b2085ca20
local 59d70b8a489b6472368228b3211bd561ed3c319636138e33b6f7b084a72ed876
VOLUME NAME 为主机挂载
# 查看匿名卷具体存储目录
docker volume inspect 05003b8e1729f465bd48dd
[
{
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/05003b8e1729f465bd48dd4630d06d64c4c4fdfa66a59e1904f670d3ec9c5c1d/_data",
"Name": "05003b8e1729f465bd48dd4630d06d64c4c4fdfa66a59e1904f670d3ec9c5c1d",
"Options": {},
"Scope": "local"
}
]
# 同步数据卷 删除父容器卷后,文件还会存在
docker run -it --name centos2 --volume-from centos02 dockerhub/centos
docker-compose
官方文档:https://docs.docker.com/compose/
安装
1、下载:
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-uname -s-uname -m > /usr/local/bin/docker-compose
2、授权
chmod +x /usr/local/bin/docker-compose
docker-compose -v # 显示版本信息
体验
根据官网的demo:https://docs.docker.com/compose/gettingstarted/
python应用。计数器
1、应用 app.pay
2、DockerFile 打包镜像
3、Docker-compose.yaml文件 (web、redis)
4、启动compose项目 (docker-compose up)
流程:
1、创建网络
2、执行 Docker-file文件
3、执行Docker-compose文件
Docker-compse:
version: "3.8"
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
docker-compose 文件三层结构
version:版本
services:服务
服务1: web
#服务配置
images
build
nerwork
...
服务2:redis