Docker

把docker当作桌面系统来用

Docker简介

解决的痛点

  1. 传统的开发,如果需要一个服务部署在多台电脑,需要有多台服务器,以及每次都要重复部署
  2. 每次重装系统都得配置相应的开发环境

解决方案

  1. 虚拟机
  2. 容器

虚拟机VS容器:

特性 容器 虚拟机
启动 秒级 分钟级
存储 MB GB
性能 接近原生 弱于原生
支持数量 单机支持上千个容器 几十个

容器的用途:

  1. 组建微服务架构:一台机器上可以跑多个容器,每个容器部署服务,模拟微服务的架构
  2. 整体打包:可以在一台机器上配置不同的平台、环境(软件依赖、系统)进行打包形成容器
  3. 弹性伸缩:可以在云主机上快速部署容器服务提供更多并发和资源
  4. 环境一致性:打通开发、测试、生产环境,高度保存一致性,降低意外发生

Docker安装

  1. sudo apt-get install docker
  2. sudo apt-get install docker.io
  3. sudo apt-get install docker-registry :用来搭建私用仓库(可选)

  • 可用 docker version 查看是否安装成功
  • 把docker权限给当前用户,否则每次需要权限,sudo groupadd docker sudo gpasswd -a ${USER} docker newgrp docker
  • 运行hello-world:官网注册账号,然后登录docker login,就可以从docker hub(官网维护的公共仓库)拉取镜像,docker image pull hello-world docker run hello-world
  • 镜像加速:新建或编辑文件 vim /ect/docker/daemon.json 添加以下内容:
{
  "registry-mirrors": [
    "https://registry.docker-cn.com",
    "http://hub-mirror.c.163.com",
    "https://docker.mirrors.ustc.edu.cn"
  ]
}

然后sudo systemctl daemon-reload 再重启服务sudo systemctl restart docker,可用docker info 看到有Registry Mirrors:字段改变就行

Docker入门教程

知识

  1. 三个概念:
     镜像(image):给容器运行提供资源,里面包含依赖、程序;image可看做是一个类,Docker利用image生成对象,同一个image可生成多个对象同时运行,
     容器:image是静态的,但是运行起来就是容器,是个类创建的实例。
     仓库:存放image的地方,我们可以将image上传到仓库,也可从仓库下载。有官方的仓库,本地也有仓库。

  2. 注意事项
    容器运行有自己的存储层,但是生命周期和容器一样,一旦容器消亡,存储层 的数据也消失,所以应该使用数据卷(volume)、或者挂载物理机的目录,这些位置的读写会直接跳过存储层,直接对物理层读写。

  3. Client/Server架构
    Docker_第1张图片

  • Client:client通过RESTFUL API发送docker命令到docker daemon进程(Docker后台进程,用于管理镜像,容器以及数据卷),docker daemon进程执行镜像编译,容器启停以及分发,数据卷管理等,一个client可以与多个docker daemon通信、交互
  • DOCKER_HOST: 可以在本地,当然也可以在远端服务器上,在host里面有两个重要的东西一个是Image,一个是Containers,
  • Registry:用于存储Docker镜像,类似github,公共的Registry有Docker Hub和Docker Cloud。
  1. Dockerfile文件
    用来构建镜像的文件,类似于Makefile,Docker根据Dockfile配置生成image,
  • 案例介绍
FROM node:8.4    #该 image 文件继承官方的 node image,冒号表示标签,这里标签是8.4,即8.4版本的,会从官网下载
COPY . /app       #将当前目录下的所有文件(除了.dockerignore排除的路径),都拷贝进入 image 文件的/app目录。
WORKDIR /app     #指定接下来的工作路径为/app
RUN ["npm", "install", "--registry=https://registry.npm.taobao.org"]   #在/app目录下,运行npm install命令安装依赖。注意,安装后所有的依赖,都将打包进入 image 文件。
EXPOSE 3000/tcp   #将容器 3000 端口暴露出来, 允许外部连接这个端口。

然后执行:docker image build -t koa-demo:0.0.1 . -t参数用来指定 image 文件的名字,后面还可以用冒号指定标签。如果不指定,默认的标签就是latest。最后的那个点表示 Dockerfile 文件所在的路径,上例是当前路径。docker image ls 可以看到新生成的image。
然后执行:docker run -p 8000:3000 -it koa-demo:0.01 /bin/bash ,-p参数:容器的 3000 端口映射到本机的 8000 端口。-it参数:容器的 Shell 映射到当前的 Shell,然后你在本机窗口输入的命令,就会传入容器。koa-demo:0.0.1:image 文件的名字(如果有标签,还需要提供标签,默认是 latest 标签)。/bin/bash:容器启动以后,内部第一个执行的命令。


可以在Dockfile最后加入 CMD node demos/01.js,表示一启动docker就执行的命令,RUN命令在 image 文件的构建阶段执行,执行结果都会打包进入 image 文件;CMD命令则是在容器启动后执行。另外,一个 Dockerfile 可以包含多个RUN命令,但是只能有一个CMD命令。

  • slam环境
版本
Eigen 3.2.10
ceres 1.13.0
g2o 20170730
opencv 3.4.1
sophus
boost
pangolin
DBow 3
ros kinetic
在这里插入代码片

常用命令

  • 启动docker服务 : sudo systemctl start docker
  • 终止docker服务:sudo systemctl stop docker
  • 启动、停止容器:docker start id docker stop id , 或者直接Ctr+d 或者docker kill id 都能退出容器运行
  • 查看所有正在运行的容器:docker ps 或者 docker container ls, -a列出所有包括 终止运行的容器文件,依然会占据硬盘空间,可以使用docker container rm id
  • 搜索相关image:docker search ubuntu
  • 拉取image:docker image pull hello-world
  • 删除image:docker rmi -f hello-world
  • 推送image:docker push image_name:tag_name 官网得先登录:docker login
  • 列出本地image:docker image ls
  • 利用image启动一个容器:docker run --rm -it ubuntu:16.04 /bin/bash,–rm:停止运行后,自动删除容器文件, -i:交互式操作,-t:终端,ubuntu:ubuntu镜像,/bin/bash:传递的命令参数, --volume “$PWD/”:/var/www/html 把当前目录映射到容器的/var/www/html
  • 为镜像设置标签:docker tag 容器id image_name:tag_name
  • 跟新镜像:docker commit -m "add eigen library" container_id image_id:tag_id
  • Dockerfile构建镜像:docker build -t ubuntu:16.04 path_to_Dockerfile,-t:指定镜像名

多个终端打开docker

  1. 找到container id,然后执行docker exec -it container_id /bin/bash, 这样就打开了另一个终端,但是如果第一个终端退出,这个也会退出
  2. 另外的方法

Docker部署WordPress

阮一峰的微服务教程

Docker部署slam环境

你可能感兴趣的:(杂项)