Docker 学习
docker 简介
docker是一个开源的应用容器引擎(分层结构),开发者可以打包自己的应用到容器里面,然后迁移到其他机器的docker应用中,可以实现快速部署。如果出现的故障,可以通过镜像,快速恢复服务。
- 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
- 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
- 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
docker 安装
安装
1. 卸载:
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2. 安装yum-utils软件包
yum install -y yum-utils
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
可以替换为:
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 阿里云 建议使用
3. 安装DOCKER引擎
可以先更新yum yum makecache fast (可以不执行)
yum install docker-ce docker-ce-cli containerd.io
配置阿里云镜像
-
登录阿里云 进入地址:
https://cr.console.aliyun.com/cn-beijing/instances/mirrors -
修改daemon配置文件/etc/docker/daemon.json来使用加速器
参考阿里云文档sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF'{ "registry-mirrors": ["https://xxx.mirror.aliyuncs.com"]}EOF sudo systemctl daemon-reload sudo systemctl restart docker
-
docker info 查看
docker 启动
systemctl start docker 启动
systemctl stop docker 关闭
systemctl status docker 状态
systemctl restart docker 重启
docker version 版本
systemctl enable docker 开机自起
镜像基本命令
docker stats: 内存占用情况
docker images 查看镜像 -a 所有信息 --digests 完整镜像id
docker search 查询镜像 -s 收藏大于 镜像
docker pull 拉取
docker rmi 删除 -f 强制删除
docker rmi $(docker images -aq) 删除所有
容器基本命令
docker run 运行镜像
-i 以交互模式运行容器,通常与 -t 同时使用
-t 为容器重新分配一个伪输入终端,通常与 -i 同时使用
-d 后台运行容器,并返回容器ID
--name 为容器指定一个名称
-p 指定端口映射,格式为:主机(宿主)端口:容器端口
-P: 随机端口映射,容器内部端口随机映射到主机的高端口
--net 指定network
docker start/stop/restart 容器名|容器id
退出运行容器
exit 退出停止
Ctrl+p+q 退出不停止
docker rm 删除容器
-f 强制删除
-l :移除容器间的网络连接,而非容器本身。
-v :删除与容器关联的卷。
docker rm $(docker ps -a -q) 删除所有已经停止的容器
docker pause :暂停容器中所有的进程。
docker unpause :恢复容器中所有的进程。
docker create :创建一个新的容器但不启动它
docker create --name myrunoob nginx:latest
docker exec :在运行的容器中执行命令 开启新终端
docker exec -it 容器 /bin/bash
root 用户进入
docker exec -it --user root <container id> /bin/bash
docker attach :进入正在运行代码终端
docker inspect : 获取容器/镜像的元数据。
docker logs : 获取容器的日志
-f : 跟踪日志输出
--since :显示某个开始时间的所有日志
-t : 显示时间戳
--tail :仅列出最新N条容器日志
docker logs -f tomcat
docker 日志目录 /var/lib/docker/containers
docker export :将文件系统作为一个tar归档文件导出到STDOUT。
-o :将输入内容写到文件。
docker export -o mysql-`date +%Y%m%d`.tar a404c6c174a2
docker export -o tomcat-`date +%Y%m%d`.tar 容器id
docker import : 从归档文件中创建镜像。
docker import 【tar 包】 新镜像名称
docker import tomcat-20200616.tar my/tomcat:v1
docker save : 将指定镜像保存成 tar 归档文件。
docker save -o tomcat2.tar my/tomcat
-o :输出到的文件
docker save -o 【tar名】 镜像名
docker load : 导入使用 docker save 命令导出的镜像。
--input , -i : 指定导入的文件,代替 STDIN。
--quiet , -q : 精简输出信息。
docker load --input tomcat2.tar
docker port :列出指定的容器的端口映射
docker cp :用于容器与主机之间的数据拷贝
docker cp tomcat:/usr/local/tomcat/webapps /root/tomcat 拷贝到宿主机
docker cp a.txt tomcat:/usr/local/tomcat/webapps 拷贝容器中
docker login -u 用户名 -p 密码
docker logout
docker commit :从容器创建一个新的镜像。
-a :提交的镜像作者;
-c :使用Dockerfile指令来创建镜像;
-m :提交时的说明文字;
-p :在commit时,将容器暂停。
docker commit -a "dc" -m "tijiao" 容器id 新容器:版本
docker push : 将本地的镜像上传到镜像仓库,要先登陆到镜像仓库
注意 :本地镜像名称格式 (dockerhub登录名/镜像名:tag)
docker挂载
docker 挂载命令 -v
docker 目录挂载 -v
docker run -it --name tomcat2 -p8090:8080
-v 宿主主机目录:容器目录
docker run -it --name tomcat2 -p8899:8080 -v /root/tomcat/:/usr/local/tomcat/cdata tomcat:1.0
docker 挂载3中方式
-
匿名挂载
docker volume ls 查看卷 docker run -d --name niming -P \ -v /etc/nginx nginx
匿名挂载不指定具体挂载目录
通过 docker inspect 容器启动名|id 查看挂载信息
-
具名挂在 (比较常用)
docker run -d --name juming -P -v juming-nginx:/etc/nginx ngin
3. 制定具体目录挂载
注意:挂在前有时候创建好目录 不然文件会被清空
docker run --name=nginx -d -p 80:80 -v /root/softdata/nginx/www:/usr/share/nginx/html \
-v /root/softdata/nginx/nginx.conf:/etc/nginx/nginx.conf \
-v /root/softdata/nginx/conf.d:/etc/nginx/conf.d \
-v /root/softdata/nginx/log:/var/log/nginx nginx
- 容器之间挂载(数据卷容器) 容器间数据同步
dcoker run -it --name docker02 --volumes-form docker02 镜像
Dockerfile
- 命令 都是大写
FROM 来源
MAINTAINER:作者(名字+<邮箱>)
RUN 运行命令
COPY:复制文件
ENV: 环境变量
EXPOSE :服务端口
WORKDIR :运行目录
ENTRYPORT:运行容器执行 可追加
CMD:运行容器执行 最后一个命令生效
编写centos
FROM centos
MAINTAINER dc<123456@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
run yum -y install net-tools
EXPOSE 80
CMD echo $MYPAYH
CMD echo "---end--"
CMD /bin/bash
构建
注意最后有个“.”
docker build -f centosfile -t mycentos .
编写tomcat 镜像
放入相应包 创建Dockerfile(不用-f 可以构建)
FROM centos
MAINTAINER dc<123456@qq.com>
COPY readme.txt /usr/local/readme.txt
ADD jdk-8u281-linux-x64.tar.gz /usr/local
ADD apache-tomcat-9.0.45.tar.gz /usr/local
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_281
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.45
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.45
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.45/bin/startup.sh && tail -f /usr/local/apache-tomcat-9.0.45/logs/catalina.out
构建
docker build -t mytomcat .
drun -d -p 9090:8080 --name mytomcat -v /root/tomcat/test:/usr/local/apache-tomcat-9.0.45/webapps/test -v /root/tomcat/
logs:/usr/local/apache-tomcat-9.0.45/logs mytomcat
测试
在test 创建WEB-INF 在创建web.xml ,然后再test下写html测试
编写springboot 镜像
FROM openjdk:8-jdk-alpine
MAINTAINER dc<123qq.com>
WORKDIR /root/boom
#日志
VOLUME /logs
COPY /config/application.properties application.properties
ADD boom-0.0.1-SNAPSHOT.jar boom.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "boom.jar"]
构建:
docker build -t myapp .
启动
docker run -d --name app -p5052:5050 -v /root/boom/log:/logs -v /root/boom/config/application.properties:/root/boom/application.properties myapp
如果想要输出日志挂载具体日志目录
springboot没有使用外部(如logback)只需 application.properties 配置
logging.file.name=/logs/app.log
编写docke-compose.yml 镜像
version: '2'
services:
appcom:
container_name: app1
image: myapp:latest
mem_limit: 1024m
ports:
- 5053:5050
environment:
- JAVA_OPTS="-Xmx1g -Xms512m"
volumes:
- ./log:/logs
- ./config/application.properties:/root/boom/application.properties
简单学习 docker-compose up -d | 更新后:docker-compose build 重新构建
docker 网络
网络 docker 容器与容器直接连通 通过evth_pair 技术 成对出现
如:
- 启动一个tomcat 容器 查看容器ipaddr
查看本机ip addr
可以看见成对出现 ,同事可以看见网桥docker0 网段 本地与容器可以相互ping通
2. 启动第二个tomcat
3. 2 个tomcat 通过ip地址可以相互ping
但是如果是动态ip无法知道ip 通过容器名称是无法相互ping 可以使用最初 –link 解决
启动tomcat3 --link 连接tomcat1
进入Tomcat3 ping Tomcat1 可以ping通
tomcat3 与tomcat2 无法ping
但是tomcat1 无法ping tomcat3
所以不推荐使用–link
自定义网络
查看docker 网络
docker network ls
构建自定义网络
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
docker network create 创建
subne子网 gatwway 网关
启动容器 --net
可以发现容器之间可以相互ping
docker 监控 portainer
docker pull portainer/portainer
docker run -p 9000:9000 -p 8000:8000 --name portainer \
--restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /root/portainer/data:/data \
-d portainer/portainer
ip:9000 登录
可以监控本地 也可以监控远程·
监控远程需要开启远程端口
vi /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H fd:// --containerd=/run/containerd/containerd.sock
systemctl daemon-reload
systemctl restart docker