Docker(一)

Posted on 2018-10-23 14:56  eilinge  阅读(144)  评论(0编辑  收藏  举报
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

Docker的应用场景

Web 应用的自动化打包和发布。
自动化测试和持续集成、发布。
在服务型环境中部署和调整数据库或其他的后台应用。
从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境。

Docker 的优点

1、简化程序:
Docker 让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,便可以实现虚拟化。Docker改变了虚拟化的方式,使开发者可以直接将自己的成果放入Docker中进行管理。方便快捷已经是 Docker的最大优势,过去需要用数天乃至数周的    任务,在Docker容器的处理下,只需要数秒就能完成。
2、避免选择恐惧症:
如果你有选择恐惧症,还是资深患者。Docker 帮你    打包你的纠结!比如 Docker 镜像;Docker 镜像中包含了运行环境和配置,所以 Docker 可以简化部署多种应用实例工作。比如 Web 应用、后台应用、数据库应用、大数据应用比如 Hadoop 集群、消息队列等等都可以打包成一个镜像部署。
3、节省开支:
一方面,云计算时代到来,使开发者不必为了追求效果而配置高额的硬件,Docker 改变了高性能必然高价格的思维定势。Docker 与云的结合,让云空间得到更充分的利用。不仅解决了硬件管理的问题,也改变了虚拟化的方式。

Ubuntu Docker 安装Docker

前提条件
    Docker 要求 Ubuntu 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的 Ubuntu 版本是否支持 Docker:uname -r 

Ubuntu 16.04 安装 Docker

1.选择国内的云服务商,这里选择阿里云为例
    curl -sSL http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-engine/internet | sh -
2.安装所需要的包
    sudo apt-get install linux-image-extra-$(uname -r) linux-image-extra-virtual
3.添加使用 HTTPS 传输的软件包以及 CA 证书
    sudo apt-get update
    sudo apt-get install apt-transport-https ca-certificates
4.添加GPG密钥
    sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
5.添加软件源
    echo "deb https://apt.dockerproject.org/repo ubuntu-xenial main" | sudo tee /etc/apt/sources.list.d/docker.list
6.添加成功后更新软件包缓存
    sudo apt-get update
7.安装docker
    sudo apt-get install docker-engine
8.启动 docker
    sudo systemctl enable docker
    sudo systemctl start docker

Docker 设置代理

3.1 创建目录
    mkdir -p /etc/systemd/system/docker.service.d
3.2 创建文件/etc/systemd/system/docker.service.d/http-proxy.conf,内容如下:
    [Service]
    Environment="HTTP_PROXY=http://pill:pill@node2:3128/"
3.3 重启docker
    systemctl daemon-reload
    systemctl restart docker
3.4 验证docker代理是否设置成功
    systemctl show --property=Environment docker  
3.5 显示如下结果说明设置成功
    Environment=GOTRACEBACK=crash HTTP_PROXY=http://pill:pill@node2:3128/

Docker 安装 Python

搜索python
    docker search python
拉取python
    docker pull python:3.5
可以在本地镜像列表里查到REPOSITORY为python,标签为3.5的镜像
    docker images python:3.5 

使用python镜像
~/python/myapp目录下创建一个 helloworld.py 文件,代码如下:
    #!/usr/bin/python
    print("Hello, World!");
运行容器
runoob@runoob:~/python$ docker run  -v $PWD/myapp:/usr/src/myapp  -w /usr/src/myapp python:3.5 python helloworld.py
    -v $PWD/myapp:/usr/src/myapp :将主机中当前目录下的myapp挂载到容器的/usr/src/myapp
    -w /usr/src/myapp :指定容器的/usr/src/myapp目录为工作目录
    python helloworld.py :使用容器的python命令来执行工作目录中的helloworld.py文件

使用mongo镜像

运行容器
    runoob@runoob:~/mongo$ docker run -p 27017:27017 -v $PWD/db:/data/db -d mongo:3.2
    cda8830cad5fe35e9c4aed037bbd5434b69b19bf2075c8626911e6ebb08cad51
        -p 27017:27017 :将容器的27017 端口映射到主机的27017 端口
        -v $PWD/db:/data/db :将主机中当前目录下的db挂载到容器的/data/db,作为mongo数据存储目录
查看容器启动情况
    runoob@runoob:~/mongo$ docker ps 
    CONTAINER ID   IMAGE        COMMAND                   ...    PORTS                      NAMES
    cda8830cad5f   mongo:3.2    "/entrypoint.sh mongo"    ...    0.0.0.0:27017->27017/tcp   suspicious_goodall
使用mongo镜像执行mongo 命令连接到刚启动的容器,主机IP为172.17.0.1
    docker run -it mongo:3.2 mongo --host 172.17.0.1

docker常用命令

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]:创建一个新的容器并运行一个命令
    -d: 后台运行容器,并返回容器ID;
    -i: 以交互模式运行容器,通常与 -t 同时使用;
    -p: 端口映射,格式为:主机(宿主)端口:容器端口
    -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
使用镜像 nginx:latest,以后台模式启动一个容器,将容器的 80 端口映射到主机的 80 端口,主机的目录 /data 映射到容器的 /data
    docker run -p 80:80 -v /data:/data -d nginx:latest

docker rm [OPTIONS] CONTAINER [CONTAINER...]:删除一个或多少容器
    -f :通过SIGKILL信号强制删除一个运行中的容器
    -l :移除容器间的网络连接,而非容器本身
    -v :-v 删除与容器关联的卷

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]:在运行的容器中执行命令
-d :分离模式: 在后台运行
    -i :即使没有附加也保持STDIN 打开
    -t :分配一个伪终端
在容器mynginx中以交互模式执行容器内/root/runoob.sh脚本
    runoob@runoob:~$ docker exec -it mynginx /bin/sh /root/runoob.sh

docker ps : 列出容器
    -a :显示所有的容器,包括未运行的。
    -f :根据条件过滤显示的内容。
    --format :指定返回值的模板文件。
    -l :显示最近创建的容器。
    -n :列出最近创建的n个容器。

docker export :将文件系统作为一个tar归档文件导出到STDOUT
    -o :将输入内容写到文件。
将id为a404c6c174a2的容器按日期保存为tar文件。
    runoob@runoob:~$ docker export -o mysql-`date +%Y%m%d`.tar a404c6c174a2

docker images : 列出本地镜像。
    -a :列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层);
    --digests :显示镜像的摘要信息;
    -f :显示满足条件的镜像;
    --format :指定返回值的模板文件;
    --no-trunc :显示完整的镜像信息;
    -q :只显示镜像ID。

遇到的问题

mongod 命令执行发现已经有进程在运行mongod数据库--errno:48 Address already in use for socket: 0.0.0.0:27017
处理方法:终端中输入:
    ps aux | grep mongod
找到对应进程id,杀死:
    kill -9 pid
再次执行 mongod 命令就可以开启 mongodb 服务

Error: "https://apt.dockerproject.org/repo ubuntu-xenial Release"
解决办法: http://tieba.baidu.com/p/4856244750

Ubuntu更换源:
https://blog.csdn.net/qq_35451572/article/details/79516563
Ubuntu设置代理:
https://www.cnblogs.com/supernalsnow/p/5542724.html

Error: docker: Error response from daemon: failed to start shim: exec: "docker-containerd-shim": executable file not found in $PATH: unknown.
解决办法: service docker restart