what's the Docker

  Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。

  Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

  容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

Docker的应用场景

  • Web 应用的自动化打包和发布。

  • 自动化测试和持续集成、发布。

  • 在服务型环境中部署和调整数据库或其他的后台应用。

  • 从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境。

Docker 安装及使用

安装 Docker

  • Ubuntu 安装 Docker

    sudo apt-get install docker.io # 安装docker
  • CentOS 安装 Docker
    # 安装之前,建议先yum -y upgrade更新软件包
    # 安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
    # 设置yum源
    yum-config-manager --add-repo
    '''
    https://download.docker.com/linux/centos/docker-ce.repo
    已加载插件:fastestmirror, langpacks
    adding repo from: https://download.docker.com/linux/centos/docker-ce.repo
    grabbing file https://download.docker.com/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo
    repo saved to /etc/yum.repos.d/docker-ce.repo
    ''' # 查看所有仓库中所有docker版本,并选择特定版本安装
    yum list docker-ce --showduplicates | sort -r # 安装Docker
    yum install docker-ce-版本号
  • Windows 安装 Docker:参考官方文档 https://docs.docker.com/toolbox/toolbox_install_windows/
    • 注:在Windows10上安装 Docker 是一件很坑的事,win10 企业版和专业版可以直接安装 Docker for Windows,但是 win10 家庭版需要安装 Docker Toolbox,Docker Toolbox 的原理是创建一台安装有 Docker 环境的 Linux 虚拟机,指定机器名称为 default。安装完成后会在桌面得到3个客户端,分别是 Oracle VM VirtualBox、Kitematic (Alpha) 和 Docker Quickstart Terminal,Oracle VM VirtualBox 用于查看虚拟机,Docker Quickstart Terminal 是一个终端工具用于启动 Docker。如果一切顺利的话,安装完成后双击 Docker Quickstart Terminal,你的 Docker 服务就起来了,但是!!!双击后你大概率会遇到卡在 waiting for an IP... 的位置,然后报错,处理方式自行GOOGLE吧,祝你好运。
  • MacOS 安装 Docker

    brew cask install docker

重启 Docker

service docker restart
'''
如果不重启,docker pull时会有如下错误:
Warning: failed to get default registry endpoint from daemon (Cannot connect to the Docker daemon. Is the docker daemon running on this host?)...
'''

拉取 Ubuntu 或 CentOS镜像

sudo docker pull daocloud.io/ubuntu # 拉取一个ubuntu镜像到本地
sudo docker pull centos:7.2.1511 # 拉取一个CentOS 7.2镜像到本地

列出镜像

sudo docker images

记住上面两个镜像各自的 IMAGE ID,进入 Docker 时需要用到(删除镜像时同样也需要用到)

删除镜像

docker rmi 镜像ID

装载镜像到容器并运行进入容器系统

sudo docker run -it -p 2221:22 -p 8880:80 7698f282e524 /bin/bash # 运行ubuntu容器系统
exit # 退出Ubuntu容器
sudo docker run -it -p 2221:22 -p 8880:80 9aec5c5fe4ba /bin/bash # 运行centos容器系统
exit # 退出CenOS容器
--name # 指定容器名,"--name my_Ubuntu"指定容器名为"my_Ubuntu";
-p # 映射端口,"-p 80:80"表示映射容器80端口到主机80端口,参数格式ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort | containerPort
-P # 映射端口,将容器暴露的所有端口,都随机映射到宿主机上(不推荐使用)
--net=host # 映射端口的另一种方式,容器的所有端口都映射到宿主机相应端口上
-d # 在后台运行,并打印container id
-e LANG=en_US.UTF-8 # 指定支持中文
--memory # 限制容器的内存使用量(如10m,200m等)
--memory-swap # 限制内存和 Swap 的总和,不设置的话默认为--memory的两倍
'''
如果只指定了 --memory 则 --memory-swap 默认为 --memory 的两倍
如果 --memory-swap 和 --memory 设置了相同值,则表示不使用 Swap
如果 --memory-swap 设置为 -1 则表示不对容器使用的 Swap 进行限制
如果设置了 --memory-swap 参数,则必须设置 --memory 参数
后期 update --memory 时数值不能超过 --memory-swap 的值,否则会报错 Memory limit should be smaller than already set memoryswap limit
'''

启动 docker 时的几个常用参数

列出全部装载的容器,包括已停止的和正在运行的

sudo docker ps -a # -a 参数会列出停止的容器,不加-a只显示正在运行的容器

后台启动 / 关闭 Docker

sudo docker start 容器ID # 后台启动容器
# sudo docker stop 容器ID # 关闭后台启动的容器
sudo docker ps # 列出当前正在运行的容器 # 进入当前容器
sudo docker attach 容器ID # 此命令进入容器后,输入 exit 退出容器时会关闭容器,推荐使用 exec
sudo docker exec -it 6d00698360eb  env LANG=C.UTF-8 /bin/bash #此命令进入容器后,输入 exit 退出容器时不会关闭容器,容器依旧会在后台运行 # 进入 MySQL 容器命令
sudo docker exec -it 容器ID  env LANG=C.UTF-8 bash # 进入 Redis 容器命令
sudo docker exec -it 容器ID  env LANG=C.UTF-8 redis-cli

Docker 支持中文

  如果在容器启动时没有指定语言的话,docker 默认是不支持中文的。使用 locale 命令可以看到默认都是"POSIX"

解决方法

# 编辑文件
nano /etc/profile # 将下面变量加到最后一行,保存并推出
LANG=zh.CN.utf8 # 重新加载文件
source /etc/profile
# 方式一
export LANG=C.UTF-8 LC_ALL=C.UTF-8 # 上述若出现warning信息无法成功,试试方式二
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8

针对docker环境运行Python脚本报错'ascii' codec can't decode byte 0xe6 in position 854: ordinal not

Docker update

  有时候我们需要更改已经启动的容器的某些配置,可以使用 docker update 命令

docker update --cpus "0.5"  容器ID # 限制指定容器的 CPU 占用最多为 0.5CPU
docker update --cpus "1.5" --cpuset-cpus 0 容器ID # 指定使用的 CPU 核(0 表示使用第一个核)
docker update --memory 20m 容器ID # 限制指定容器的最大使用内存(20m)

查看和统计容器所占用的资源情况

docker stats # 动态查看,每秒更新一次
docker stats --no-stream # --no-stream 参数表示只查看当前状态,不动态显示
docker top 容器ID # 默认显示UID、PID、PPID、C、STIME、TTY、TIME、CMD
docker top 容器ID -o pid,stat,cmd # 使用 -o 参数可指定显示信息

将一个容器打包成镜像并在其他电脑中加载这个镜像

  现在我有这么一个需求:我在另一台已经装了 Docker 的电脑B上开发了一个项目,项目在 Docker 的 Centos 容器里,我要把这个容器拎出来放到现在这台电脑A上,这样我就不用安装一大堆依赖,直接 run 就能运行项目了

  首先我在电脑B容器中 docker ps -a 看一下,有3个容器,开发的项目在第一个容器里,要将它打包成镜像放到电脑A中使用

方式一:

  将容器导出成一个 tar 包,然后将这个 tar 包还原成一个新的镜像

  • 打包命令

    sudo docker export vigorous_hypatia >   /home/zmh/下载/centos7_sipenv.tar
    # vigorous_hypatia 是要打包的容器的 NAMES,>后面跟的是打包后的文件存放的路径
  • 然后我们就会得到一个centos7_sipenv.tar文件,把这个文件手动拷贝或者发送到电脑A,然后在电脑A中运行加载命令
    cat '/home/aitester/centos7_sipenv.tar'  | docker import  - xxx
    # cat 后面跟的是tar文件的路径,import后面跟的是新容器的 NAME
  • 之后我们用 docker images 就能看到这个镜像已经被加载了之后我们用 docker images 就能看到这个镜像已经被加载了之后我们用 docker images 就能看到这个镜像已经被加载了

 方式二

  将容器重新做成一个镜像,将这个镜像导出成一个 tar 包,然后将这个 tar 包还原成一个新的镜像

  • 将容器变为镜像

    docker commit  261314c94305  imagexxx
    '''
    可用参数
    -a :提交的镜像作者;
    -c :使用Dockerfile指令来创建镜像;
    -m :提交时的说明文字;
    -p :在commit时,将容器暂停。
    imagexxx是新创建的镜像的名字
    '''
  • 将镜像变为 tar 包
    docker save -o xxx.tar imagexxx # 当前路径下会生成一个xxx.tar
  • 将 tar 包转换成新的镜像
    docker load --input xxx.tar

两种方式的区别

  • 方式一的命令相对简单
  • 方式二的优势:可以将原容器中的相应设置一并保留。如:原容器中装了 anaconda,项目指定了某 Python 环境,直接输入命令 python xxx.py 就启动了项目。如果使用方式二,在新容器中可以直接  python xxx.py 启动项目;而在方式一的情况下,新容器需要先执行指定 Python 环境的命令,再 python xxx.py,否则就会找不到 Python。

推荐使用方式二

Docker手册其他链接

  Docker 命令大全

  Docker CentOS容器开启 SSH 服务

  Docker 安装 MySQL 并实现远程连接

参考:https://www.cnblogs.com/luyanjie/p/9656863.html

新手Docker入门的更多相关文章

  1. GitHub新手快速入门日常操作流程

    GitHub新手快速入门日常操作流程 1. 注册帐号 打开https://github.com/,填写注册信息并提交. 2. 登录帐号 打开https://github.com/login,输入注册的 ...

  2. 第三章 Docker 入门

    第三章 docker 入门 3.1 确保docker已经就绪 首先查看docker程序是否存在,功能是否正常 [#3#cloudsoar@cloudsoar-virtual-machine ~]$su ...

  3. Docker入门教程(九)10个镜像相关的API

    Docker入门教程(九)10个镜像相关的API [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第九篇,重点介绍了镜像相关的Docker Remote ...

  4. Docker入门教程(八)Docker Remote API

    Docker入门教程(八)Docker Remote API [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第八篇,重点介绍了Docker Remote ...

  5. Docker入门教程(七)Docker API

    Docker入门教程(七)Docker API [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第七篇,重点介绍了Docker Registry API和 ...

  6. Docker入门教程(六)另外的15个Docker命令

    Docker入门教程(六)另外的15个Docker命令 [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第六篇,继续介绍Docker命令.之前的第二篇文章 ...

  7. Docker入门教程(五)Docker安全

    Docker入门教程(五)Docker安全 [编者的话]DockOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第五篇,介绍了Docker的安全问题,依然是老话重谈,入门者可以通 ...

  8. Docker入门教程(四)Docker Registry

    Docker入门教程(四)Docker Registry [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第四篇,介绍了Docker Registry,它 ...

  9. Docker入门教程(三)Dockerfile

    Docker入门教程(三)Dockerfile [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第三篇,介绍了Dockerfile的语法,DockerOn ...

随机推荐

  1. Linux命令——gdisk、fdisk、partprobe

    gdisk.fdisk MBR分区表请使用fdisk分区,GPT分区表请使用gdisk分区 MBR与GPT区别参考:Linux磁盘管理——MBR 与 GPT gdisk.gdisk这两个命令参数不需要 ...

  2. Python的高级文件操作(shutil模块)

    Python的高级文件操作(shutil模块) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 如果让我们用python的文件处理来进行文件拷贝,想必很多小伙伴的思路是:使用打开2个 ...

  3. MacOS安装Docker

    傻瓜式安装: 1. 浏览器或命令行下载:https://download.docker.com/mac/stable/Docker.dmg 2. 点击安装文件,拖动图标到应用 3. 确认安装正常:do ...

  4. 使用python的jira库操作jira的版本单和问题单链接

    操作JIRA的API来实现的. 但感觉比单纯操作API要简单一些. from jira import JIRA from django.conf import settings JIRA_URL = ...

  5. Kotlin协程作用域与Job详解

    Job详解: 在上一次https://www.cnblogs.com/webor2006/p/11725866.html中抛出了一个问题: 所以咱们将delay去掉,需要改造一下,先把主线程的dela ...

  6. MySQL——时间戳和时间的转化

    前言 Mysql中时间戳和时间的转化 时间转时间戳 select unix_timestamp('2019-7-29 14:23:25'); 时间戳转时间 select from_unixtime(1 ...

  7. django-安装nginx及fastdfs-nginx-module

    安装nginx及fastdfs-nginx-module 1. 解压缩 nginx-1.8.1.tar.gz 2. 解压缩 fastdfs-nginx-module-master.zip 3. 进入n ...

  8. Git学习笔记--配置(二)

    由之前文章,总结得出Git的特点: 最优的存储能力: 非凡性能: 开源的: 管理成本低: 很容易做备份: 支持离线操作: 很容易定制工作流程: Git is a free and open sourc ...

  9. 初学FWT(快速沃尔什变换) 一点心得

    FWT能解决什么 有的时候我们会遇到要求一类卷积,如下: Ci=∑j⊕k=iAj∗Bk\large C_i=\sum_{j⊕k=i}A_j*B_kCi​=j⊕k=i∑​Aj​∗Bk​此处乘号为普通乘法 ...

  10. yolov1详细讲解

    前言 当我们谈起计算机视觉时,首先想到的就是图像分类,没错,图像分类是计算机视觉最基本的任务之一,但是在图像分类的基础上,还有更复杂和有意思的任务,如目标检测,物体定位,图像分割等,见图1所示.其中目 ...