社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  docker

Docker

Rush6666 • 3 年前 • 356 次点击  

大一菜鸡的个人笔记,欢迎指点和交流。

Docker

Docker的意义

把项目和运行环境打包成镜像,在docker仓库下载我们发布的镜像。

Docker和虚拟机的不同

传统虚拟机虚拟出一条硬件,运行一个完整的操纵系统,然后在这个系统上安装和运行软件。

容器中的应用直接运行在宿主机,没有内核,也没有虚拟硬件,所以效率高。每个容器之间互不影响。

组成

  • ​ 镜像(image):镜像像是一个模板,通过这个模板创建容器服务,通过这个镜像可以创建多个容器。(最终服务运行或者项目运行就是在容器中的)
  • ​ 容器(container):Docker利用容器技术,独立运行一个或者一组应用,通过镜像来创建。
  • ​ 仓库(repository):存放镜像的地方,分为公用仓库和私有仓库。

DockerHub 阿里云

Docker比起虚拟机的优势

image-20200719181016358

  • Docker的抽象层比虚拟机少
  • Docker使用宿主机内核,虚拟机加载Guest Os

image-20200719181410342

命令

帮助命令

docker version 显示版本信息
docker info 显示系统信息 包括镜像和容器的数量
docker --help 帮助命令
  • 1
  • 2
  • 3

镜像命令

docker images

docker images 查看所有本地的主机上的镜像

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              bf756fb1ae65        6 months ago        13.3kB

REPOSITORY 镜像的仓库源
TAG 标签
IMAGE ID 镜像的id
CREATED 镜像的创建时间
SIZE 镜像的大小

docker images -q 只显示镜像的id
docker images -a 显示所有镜像

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
docker search 
可选限制条件:--filter=START=3000
docker pull 下载镜像 如果不写tag 默认是latest
docker pull mysql:5.7 指定版本下载

docker rmi -f id 根据id删除镜像
docker rmi -f id id id id 删除多个镜像
docker rmi -f ${docker image -aq} 根据搜索结果把所有镜像都删除

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

运行容器

docker run image
--name="Name" 容器名字
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口 -p :8080

例: docker run -it centos /bin/bash

docker ps 列出所有运行的容器
docker ps -a -n=1 只列出一个
docker ps -aq 显示所有容器的编号
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

退出容器

exit 停止容器并退出
Ctrl + P + Q 容器不停止 退出
  • 1
  • 2

删除容器

docker rm id 根据id删除容器
docker rm -f ${docker ps -aq} 删除所有容器
docker ps -a -q|xargs docker rm 删除所有的容器
  • 1
  • 2
  • 3

启动和停止容器

docker start 容器id 启动容器
docker restart 容器id 重启容器
docker stop 容器id 停止当前正在运行的容器
docker kill 容器id 强制停止当前容器
  • 1
  • 2
  • 3
  • 4

其他常用指令

后台启动容器

docker run -d 镜像名 后台运行镜像
docker发现没有前台运行 就会停止
  • 1
  • 2

查看日志

docker logs 
  • 1

查看容器中进程信息

docker top id
docker inspect id 详细信息
  • 1
  • 2

进入当前运行的容器

#我们通常都是使用后台方式运行 需要进入容器,修改一些配置
docker exec -it 容器id /bin/bash

docker attach --help 查看帮助指令
docker attach 容器id 
  • 1
  • 2
  • 3
  • 4
  • 5

docker exec 进入容器后开启一个新的终端

docker attach 进入容器正在执行的终端 不会启动新的进程

把容器内的文件复制到主机上

docker cp 容器id:目录 复制到的目录
  • 1

命令手册

service docker restart docker未启动 重启docker

docker search nginx 搜索nginx的镜像

docker pull nginx 下载nginx的镜像

docker images 查看本机镜像

docker run -d --name nginx01 -p:3344:80 nginx 在后台运行nginx镜像 并给nginx起别名nginx01 以公网的3344端口映射到内部的80端口

docker ps 查看运行中的所有容器

curl localhost:3344 访问本机的3344端口

docker exec -it nginx02 /bin/bash 进入别名为nginx02的镜像

whereis nginx 找到nginx的所在目录

exit 退出容器

docker stop 容器id 停止容器

docker run -it --rm tomcat:9.0 下载tomcat9.0版本(如果没有),并运行,运行完了立即删除。

docker run -d -p 3355:8080 --name tomcat01 tomcat 以暴露端口的方式启动

cp -r webapps.dist/* webapps 把webapps.diss目录下的所有文件复制到webapps目录

docker stats 查看CPU的状态

docker Ctrl+Shift+C 退出查看CPU状态

docker run -d --name elasticsearch02 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="Xms64m -Xmx512m" elasticsearch:7.6.2 
修改镜像的配置文件 限制可用内存大小

docker run -d -p 8088:9000 \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

端口的理解

image-20200721094504470

Docker镜像

​ 镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于软件运行环境开发的软件,包含库、代码、环境变量和配置文件。

Docker原理

UnionFS(联合文件系统)

​ 是一种分层、轻量级并且高性能的文件系统,支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载在同一个虚拟文件系统下。Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

image-20200721114548439

Docker镜像加载原理

​ docker的镜像实际上是由一层一层的文件系统组成,这种系统就是UnionFS。

​ bootfs(boot file system)主要包含bootloader和kernel,bootloader 主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后内核存放在内存之中,内存的使用权已由bootfs转交给内核,此时系统会卸载bootfs。

​ rootfs在bootfs之上。包含典型Linux系统中的/dev /proc /bin /etc 等标准目录和文件 rootfs就是各种不同的操作系统发行版 如 Ubuntu Centos等

​ 镜像大小比起平常的文件显得很小,就是因为对于一个精简的镜像,rootfs只包含最基本的命令,工具和程序库就可以了,底层使用Host的kernel,公用bootfs。

特点

Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部。这一层就是我们通常说的容器层,容器层之下是镜像层。

提交自己的镜像

docker commit 提交新的镜像

docker commit -a="rush" -m="add webapps app" 5e805f6fd6f4 tomcat02:1.0 
  • 1
  • 2
  • 3

image-20200721131208045

最下面是镜像层 commit可以保存当前容器的状态 获得新的镜像

容器数据卷

将容器的数据存储在本地 实现容器的持久化和同步操作,容器间的数据共享。

指定路径挂载

docker run -it -v /home/ceshi:/home centos /bin/bash 将容器的/home目录映射道本机的/home/ceshi目录 

docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql
  • 1
  • 2
  • 3

使用docker inspect 镜像id 在Mounts可以查看挂载信息

image-20200721133033150

停止容器后修改文件 启动容器可查看到修改后的文件

匿名挂载(不建议使用)

docker run -d -P --name nginx02 -v /etc/nginx nginx
随机生成卷名 不方便
  • 1
  • 2

具名挂载

docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
docker volume ls 查看所有卷的情况
docker volume inspect juming-nginx
  • 1
  • 2
  • 3

-v+卷名+内路径,没有指定目录下都是在主机的/var/lib/docker/volumes目录下

使用具名挂载可以很方便的找到我们的卷

读写权限

docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
ro表示readOnly 只读 
rw表示readWrite 可读可写 
一旦设置 不可修改 默认为rw
  • 1
  • 2
  • 3
  • 4
  • 5

数据卷容器(多个mysql数据同步)




    
docker run -it --name docker01 rush/centos:1.0 启动第一个容器
docker run -it --name docker02 --volumes-from docker01 启动第二个容器 并绑定第一个容器
docker run -it --name docker03 --volumes-from docker01
三个容器的数据卷建立了连接
  • 1
  • 2
  • 3
  • 4

如果把docker01容器删除 其他容器的对应数据卷不会被删除

使用备份机制而不是共享机制,指向的都是本地的真实目录的地址

多个mysql实现数据共享

docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=rush2017 --name mysql01 mysql:5.7

docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=rush2017 --name mysql02 mysql:5.7
--volumes-from mysql01 mysql:5.7
可以实现两个mysql数据同步
  • 1
  • 2
  • 3
  • 4
  • 5

DockerFile

  • 1.编写DockerFile文件
  • 2.docker build 构建镜像
  • 3.docker run 运行镜像
  • 4.docker push 发布镜像

特性

  • 每个关键字都必须是大写字母
  • 从上到下执行
  • #表示注释
  • 每一个指令都会创建提交一个新的镜像层

image-20200721155638411

DockerFile就是用来构建docker镜像的构建文件

包含了命令和脚本

创建一个dockerfile文件 写入脚本
FROM centos

VOLUME ["volume01","volume02"] 创建时挂载

CMD echo "----end-----"

CMD /bin/bash

然后 docker build -f /home /dockerfile -t rush/centos:1.0
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

这种挂载属于匿名挂载

需要使用inspect命令找到对应的随机目录

DockerFile指令

FROM 	用来说明这个镜像的妈妈是谁(基础镜像 例如Centos)
MAINTAINER 	谁是它的监护人(维护者信息 姓名+邮箱)
RUN 	构建时需要运行的命令(你想让他干啥)
ADD 	想要集成的组件 如tomcat镜像
WORKDIR 	镜像的工作目录
VOLUME 	挂载的主机目录
EXPOSE 	对外指定端口 类似-p
CMD 	容器启动后要干的事情 只有最后一个会生效
ENTRYPOINT 容器启动后要干的事情,可追加命令
RUN 	容器启动后要干的事情
COPY 将文件拷贝到镜像中
ENV 配置环境变量
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

最基础的镜像: scratch

构建自己的centos

1.构建DockerFile文件
FROM centos

MAINTAINER rush<1907779674@qq.com>

ENV MYPATH /usr/local

WORKDIR $MYPATH

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80

CMD echo $MYPATH
CMD echo "成功啦"
CMD /bin/bash 
2.通过文件构建镜像
docker build -f myDockerFile -t mycentos:1.0 .
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

制作自己的tomcat镜像

把需要用的文件放到同一目录下

From centos
MAINTAINER rush<1907779674@qq.com>
COPY readme.txt /usr/local/readme.txt 这是放入容器类的目录
ADD jdk-8u11-linux-x64.tar.gz /usr/local/ 会自动解压到该目录
ADD apache-tomcat-9.0.22.tar.gz /usr/local/ 会自动解压到该目录

RUN yum -y install vim

ENV MYPATH /usr/local/
WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk1.8.0_11
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINE_HOME /usr/local/apache-tomcat-9.0.22
ENV CATALINE_BASH /usr/local/apache-tomcat-9.0.22
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINE_HOME/lib:$CATALINE_HOME/bin

EXPOSE 8080

CMD /usr/local/apache-tomcat-9.0.22/startup.sh && tail -F /url/local/apache-tomcat-9.0.22/bin/logs/cataline.out 运行tomcat 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

发布镜像

docker tag 镜像id 作者账号名/镜像名:版本号
docker push 
  • 1
  • 2

Docker Compose

​ 微服务架构的应用一般包含多个微服务,每个微服务一般都会部署多个实例,如果每个实例都需要手动操作,那么效率之低,维护工作量之大可想而知。

​ Docker Compose就是帮助我们管理容器的神器,它是用于定义和运行多容器Docker的应用程序工具。

下载Docker Compose

推荐使用国内的镜像 可以修改下方的1.22.0下载想要的版本
curl -L https://get.daocloud.io/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`


    
-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

github下载
sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

使用方式

  • ①打包项目获得jar包
  • ②在jar包所在路径创建Dockerfile

FROM java:8
VOLUME /tmp
ADD docker-demo-0.0.1-SNAPSHOT.jar app.jar
RUN bash -c 'touch /app.jar'
EXPOSE 9000
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","app.jar"]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • ③在jar包所在路径创建docker-compose.yml文件

version: '2' # 表示该 Docker-Compose 文件使用的是 Version 2 file
services:
  docker-demo:  # 指定服务名称
    build: .  # 指定 Dockerfile 所在路径
    ports:    # 指定端口映射
      - "9000:8761"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

把文件夹拉到Linux环境下,执行命令

docker-compose up -d 构建镜像并后台启动
  • 1

三层容器

Docker将所管理的容器分为三层,工程(Project)、服务(Service)、容器(Container),docker-compose.yml文件的目录组成一个工程,一个工程包含多个服务,每个服务中包含了容器运行的镜像、参数、依赖,一个服务可以包含多个容器实例。

Docker Compose命令

docker-compose ps 列出所有运行中的容器

docker-compose logs 读取日志

docker-compose port eureka 8761 打印eureka服务 8761端口绑定的公共端口

docker-compose build 构建服务

docker-compose start/stop eureka 启动或停止容器

docker-compose rm eureka 删除容器

docker-compose up 构建、启动容器
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

注意事项

​ 当服务的配置发生改变时,需使用docker-compose up命令更新配置。之后,Compose会删除旧容器并创建新容器,新容器会以不同的IP地址加入网络,名称保持不变,任何指向旧容器的连接都会被关闭,直到重新连接新容器。

资料来源—— https://www.jianshu.com/p/658911a8cff3

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/71721
 
356 次点击