赞
踩
可能大家对docker了解不深,这里再简单赘述一下docker这款利器。
1.什么是docker
Doker是基于GO语言实现的云开源项目,通过对应用组件的封装、分发、部署、运行等生命周期的管理,达到应用组件级别的“一次封装,到处运行”。这里的应用组件既可以是web应用 也可以是一套数据库服务 甚至是一个操作系统或编译器。 属于对 Linux 容器的一种封装,提供简单易用的容器使用接口。
2.有什么用
Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。
Docker 的主要用途,目前有三大类。
(1)提供一次性的环境。**比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境。
(2)提供弹性的云服务。**因为 Docker 容器可以随开随关,很适合动态扩容和缩容。
(3)组建微服务架构。**通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构。
与虚拟机的差异:
特性 | 容器 | 虚拟机 |
---|---|---|
启动 | 秒级 | 分钟级 |
硬盘使用 | 一般为MB | 一般为GB |
性能 | 接近原生 | 弱于 |
系统支持量 | 单机支持上千个容器 | 一般是几十个 |
3.怎么用
docker的三大核心部分,仓库(repository),镜像(image),容器(container),简单理解为仓库就是存放所有的镜像,如dockerhub和阿里云镜像等,而镜像和容器的关系就像类和实例的关系,三者在使用过程中操作如下:
实际生产过程中,我们可以通过docker来实现对项目和环境的整体打包,一般有两种方式,一是先在服务器上构建好生产环境(先pull好基础镜像,然后逐渐添加自己需要的软件包和库),再运行该镜像,进入该镜像生成的容器内,再将整个项目copy到容器内,再通过commit就可以生成自己包含项目和环境所需的镜像文件了。二是通过dockefile来实现。下面以简单实例进行说明:
case1:在python开发之际,利用Docker搭建Python的开发环境,具体操作如下:
(1)获取所需的镜像
docker pull python:3.5
(2)构建py文件
- for i in range(3):
- print("hahahhaha")
直接用 docker run 命令运行 py文件
docker run -v /file:/usr/src/file -w /usr/src/file python:3.5 python test.py
需要注意的是:
-v 将主机的py文件目录挂载到容器中的/usr/src/file(挂载点可换,第一个file需要是绝对路径)
-w 指定容器的/usr/src/file目录为工作目录(与上面的挂载点相同)
python test.py 先指定容器,然后用容器中的python命令来执行工作目录的test.py
实例1:下载镜像:docker pull ubuntu
进入ubuntu容器交互系统:
docker run -i -t ubuntu /bin/bash
-t 是启动终端
-i是允许进行交互
这时候敲python命令会发现没有python
ubuntu下安装python:
- apt-get update
- apt-get install python3
- #安装好python用输入python3试一下
- #安装pip
- apt-get install python3-pip(这个命令好像会同时安装python2.7)
- #安装好pip用输入pip试一下
- apt-get install python3-dev
- apt-get install openssl
- apt-get install libssl-dev
- apt-get install libffi-dev
查看是否成功:
docker run -v /Users/zjl/python3i/py3image:/py3image -w /py3image ubuntu python3 a.py
Docker允许通过外部访问容器或者容器之间互联的方式来提供网络服务。容器启动之后,容器中可以运行一些网络应用,通过-p或-P参数来指定端口映射。
注意:
宿主机的一个端口只能映射到容器内部的某一个端口上,比如:8080->80之后,就不能8080->81
容器内部的某个端口可以被宿主机的多个端口映射,比如:8080->80,8090->80,8099->80,
-p 小写p表示docker会选择一个具体的宿主机端口映射到容器内部开放的网络端口上。
-P 大写P表示docker会随机选择一个宿主机端口映射到容器内部开放的网络端口上。
(3)编写dockfile文件
具体dockerfile编写指令可以参考docker---Dockerfile编写 - 爱笑的张飞 - 博客园,直接在当前目录下利用vim命令生成该文件,文件内容可以如下:
- FROM python:3.5
- COPY . /usr/src/file
- WORKDIR /usr/src/file
- ENTRYPOINT ["python"]
- CMD ["./test.py"]
如果是在windows下,也一样编写,详情可参考https://www.cnblogs.com/xianwang/p/12039922.html
(4)利用docker build 创建容器
docker build -t dockerfile:v1.0 .
最后成功结果如下
利用docker images查看所有的镜像,如果出现了dockerfile,然后运行该镜像的id,若运行结果如下,则说明创建成功。
(5)尝试save /load来保存和加载镜像文件
- ###保存
- docker save dockerfile >1.tar ####将dockerfile保存成1.tar文件
-
- ###加载
- docker load <1.tar ####加载镜像文件
-
-
- ###补充:在实验的时候需要先删除dockerfile镜像时,可以利用docker rmi -f dockerfile来实现
在安装docker之前可以在docker在线实验室里进行练习实验,具体参考链接Play with Docker。
上面说的是在基本容器的外面再基于此重新构建一个新的容器,但是如果你不想写dockerfile,直接在原基础镜像上,添加一些自己的操作来形成新的镜像,则可以参考以下操作,
- ###
- 启动容器
- docker run -itd --name 新名字 基础镜像 /bin/bash
- 进入
- docker exec -it 容器id /bin/bash
- 安装工具
- apt-get install xxx
- apt-get install xxx
-
- ###在容器外面
- 提交docker容器重新转为镜像
- docker commit 容器id new_name:version
- 导出镜像
- docker save new_name:version -o new_name.tar
实例2:
先进入打包好的项目路径,编写dockerfile文件
vim Dockerfile ###开始编写dockerfile文件
接下来里面内容为,
- FROM registry.docker-cn.com/library/tomcat ####基于哪个镜像
-
- MAINTAINER heihezi heihezi@foxmail.com ###谁做的
-
- COPY myproject.war /usr/local/tomcat/webapps ###将项目拷贝到镜像中去打包成新的镜像
dockerfile根据自己的情况进行修改,最后通过下面指令将项目和环境整体打包成为一个镜像。
sudo docker build -f Dockerfile -t myproject:latest . ###注意不要丢了最后的 .
(6)删除镜像
当自己pull下来一些images后不再使用,这时候可以对其进行删除,利用下面指令实现
- ###example
- sudo docker pull nginx:latest
-
- sudo docker rmi nginx ###可以加上-f进行强制删除
如果在删除镜像时出现Docker错误:image has dependent child images,这时候正确的做法就是先停止相关容器、删除相关容器、然后再删除镜像即可。下面这个指令可以查看列出所有在指定 image 之后创建的 image 的父 image,其中 xxxxxx 是报错 image 的 id
docker image inspect --format='{{.RepoTags}} {{.Id}} {{.Parent}}' $(docker image ls -q --filter since=xxxxxx)
补充:
》docker命令前想要免加sudo
- 添加docker group:
- sudo groupadd docker
-
- 将当前用户添加到docker组:
- sudo usermod -aG docker your_username
-
- 重启docker服务:
- sudo service docker restart
》常见的命令
容器列表
- docker ps
-
- docker ps –a
-
- docker container prune ##清理已经停止的容器内存占用
-
- docker image prune ###清理没有使用的image
启动容器
docker restart 容器id1 [容器id2] [...]
停止容器
docker stop [container id1] [container id2] [...]
启动容器
docker start [container id1] [container id2] [...]
镜像列表
docker images
删除镜像
docker rmi [image id1] [image id2] [...] ####删除镜像
docker rm [container id1] ###删除容器
docker rmi $(docker images -q)
docker start $(docker ps -a -q)
更新所有容器启动时自动启动
docker update --restart=always $(docker ps -q -a)
监控
docker stats 容器1 [容器2]
docker stats $(docker ps -a -q)
docker stats --no-stream=true $(docker ps -a -q)
进入容器内部
- docker exec -it [container id] /bin/bash
-
- docker exec -it [container id] bash
-
- docker run :根据镜像创建一个容器并运行一个命令,操作的对象是 镜像;
-
- docker exec :在运行的容器中执行命令,操作的对象是 容器。
查看容器日志
docker logs [container id]
容器卷:实现容器的持久化和同步操作,同时可以满足容器间的数据共享。
- ###格式一般为:
- -v 容器目录(匿名挂载)或 -v 本地目录:容器目录(具名挂载)
-
- docker run -v /usr/ToolsAPIDir:/ToolsAPIDir1 -d -p 5005:5004 -it toolsapi:v8 python3 tools_api.py
-
-
- docker run -it --name dc02 --volumes-from dc01 zzyy/centos ###dc02容器继承自dc01容器
具体的:
Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。如果你还不了解 YML 文件配置,可以先阅读 YAML 入门教程。
Compose 使用的三个步骤:
>使用 Dockerfile 定义应用程序的环境。
>使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
>最后,执行 docker-compose up 命令来启动并运行整个应用程序。
构建或重新构建服务。 服务一旦构建后,将会带上一个标记名,例如 web_db。 可以随时在项目目录下运行 docker-compose build 来重新构建服务。
up
构建,(重新)创建,启动,链接一个服务相关的容器。 链接的服务都将会启动,除非他们已经运行。 默认情况, docker-compose up 将会整合所有容器的输出,并且退出时,所有容器将会停止。 如果使用 docker-compose up -d ,将会在后台启动并运行所有的容器。 默认情况,如果该服务的容器已经存在, docker-compose up 将会停止并尝试重新创建他们(保持使用 volumes-from 挂载的卷),以保证 docker-compose.yml 的修改生效。如果你不想容器被停止并重新创建,可以使用 docker-compose up --no-recreate。如果需要的话,这样将会启动已经停止的容器。
down
docker-compose down 停止并删除容器
docker-compose down --rmi local
删除停止的服务容器。
docker-compose rm
logs
查看服务的输出。
docker-compose logs
列出所有容器。
docker-compose ps
kill
通过发送 SIGKILL 信号来强制停止服务容器。支持通过参数来指定发送的信号,例如
$ docker-compose kill -s SIGINT
参考链接:
docker学习之搭建自己的本地镜像仓库_IT行业学习者的博客-CSDN博客_搭建本地镜像仓库(docker学习之搭建自己的本地镜像仓库)
Docker——入门实战_等一杯咖啡的博客-CSDN博客_docker入门与实战(Docker——入门实战)
快速入门Docker---用Docker搭建Python的开发环境_逐夸父的博客-CSDN博客_docker创建python环境(快速入门Docker---用Docker搭建Python的开发环境)
一个Python项目(带前端),部署到Docker的完整过程_学编程的司马光的博客-CSDN博客_docker部署python项目(一个Python项目(带前端),部署到Docker的完整过程)
docker搭建python环境并打包镜像然后使用镜像启动python程序和flask程序_ZJL-阿友的博客-CSDN博客_docker python环境镜像(docker搭建python环境并打包镜像然后使用镜像启动python程序和flask程序)
Docker 删除镜像_不知道取啥昵称的博客-CSDN博客_docker 删除镜像(Docker 删除镜像)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。