docker安装使用系列二之容器、镜像、仓库使用实例分析

       可能大家对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容器

dockerfile

具体的:

docker-compose

Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。如果你还不了解 YML 文件配置,可以先阅读 YAML 入门教程

Compose 使用的三个步骤:

>使用 Dockerfile 定义应用程序的环境。

>使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。

>最后,执行 docker-compose up 命令来启动并运行整个应用程序。

  • build

构建或重新构建服务。 服务一旦构建后,将会带上一个标记名,例如 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

  • rm

删除停止的服务容器。

docker-compose rm  

  • logs

查看服务的输出。

docker-compose logs

  • ps

列出所有容器。

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 删除镜像)

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值