DOCKER一键入门

/ DOCKER / 0 条评论 / 878浏览 / 自动同步于GITHUB

base Ubuntu 16.04

入门操作

安装

  1. sudo apt-get remove docker docker-engine docker-ce docker.io
  2. sudo apt-get update
  3. sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common  (使apt能接受https的ppa库)
  4. curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -       (docker官方GPG密钥)
  5. sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"     (ppa库,这个地址好像不是很好用,在某些网络下会失败,成功率与各自网络有关。出现网络问题的话,有条件的同学可以考虑科学上网)
  6. sudo apt-get update
  7. sudo apt-get install -y docker-ce      (安装最新版) 如果不想要最新版: apt-cache madison docker-ce       (查看版本列表)
    sudo apt-get install docker-ce=<VERSION> (指定版本安装)

创建docker用户组

sudo groupadd docker            (应该不需要执行,已经有了)
sudo usermod -aG docker $USER     (将当前用户添加到附加组群docker)
重新登录用户账户使生效

验证

systemctl status docker     (启动状态)
sudo systemctl start docker    (启动,或 sudo service docker start
sudo docker run hello-world     (官方提供hello world程序)

创建镜像并运行生成容器

新建名称为Dockerfile的文件(无后缀名),输入如下内容并保存:

FROM ubuntu:16.04

RUN \
    apt-get update &&\
    apt-get install -y openjdk-8-jdk &&\
    rm -rf /var/lib/apt/lists/*

ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64
ENV LANG C.UTF-8

CMD ["/bin/bash"]

文件中,继承了ubuntu的docker镜像(ubuntu:16.04)的16.04版本
在该目录下直接执行以下命令新建镜像:
docker build -t mytest/jdk:1.8 .        (运行过程较长。不要漏了最后的点,最后那个点代表当前目录,倒二参数镜像名可任意设置,-t 为tag) 
docker images            可看到mytest/jdk:1.8已进入现有镜像列表中
docker run -p 80:8080 -it mytest/jdk:1.8          启动docker镜像新建立一个容器(-p 表示将主机80端口映射到容器内部的8080端口,此例中端口映射没有什么意义,只是为了说明,--name=myname :手动分配名字,-t 伪tty终端,-d 守护进程的方式后台执行(默认交互进程方式),CMD为.需要保持tty终端连接的运行命令时需要-d否则sh执行完docker就退出了),如果Dockerfile中没有定义命令CMD运行不成功,这时可在docker run的最后面添加运行命令手动指定
运行成功后,在容器内输入命令:java -version 可看到jdk已经安装成功

模块化知识点

docker概念

Docker客户端        命令行允许时给客户端发送命令,客户端分发到指定容器
Docker Daemon 守护进程        docker允许依赖的进程
Docker Image 镜像        docker启动前需要指定之前制作的镜像(即源码,只读模式)
Docker Container 容器        docker运行镜像的拷贝于虚拟机上(运行后的镜像为叫容器,即镜像的实例,读写模式),可对其停止运行,重新运行,内部命令操作,修改后重新打包为新镜像,一个镜像可运行为多个容器
Docker Registry 仓库        docker镜像存储的位置,有公有仓库与私有仓库
交互式容器与守护式容器        交互式容器:当前命令进程执行完毕容器即退出;守护式容器:当前命令进程与该进程启动的进程都运行完毕才退出,通常没有交互式程序时使用

容器停止与启动

docker stop 8d43            停止正在运行的容器(发出结束的信号,8d43为通过docker ps 查看到的name前面几个字符,stop时name无须填完整,只要docker能识别不引起歧义就行)
docker start -i 8d43            重新运行容器(-i 标准输入始终打开)
docker kill 8d43            快速强制停止容器

容器与镜像的删除

docker rm 8d43            删除已经停止的容器(需先停止容器)
docker rmi uettydkr/test:1.0            删除镜像(需先删除该镜像的所有容器实例)

容器网络设置

端口映射

docker run -P -i -t uettydkr/test:1.0            对容器暴露的所有端口进行映射
docker run -p 8080 -i -t uettydkr/test:1.0            指定容器8080端口映射到宿主机的随机端口
docker run -p 80:8080 -i -t uettydkr/test:1.0            容器的8080端口映射到宿主机的80端口
docker run -p 0.0.0.0:8080 -i -t uettydkr/test:1.0            指定容器ip和容器的端口
docker run -p 0.0.0.0:80:8080 -i -t uettydkr/test:1.0            指定容器ip,容器8080端口映射到宿主机的80端口
docker port 8d43            查看端口映射情况
docker run --net=host -i -t uettydkr/test:1.0             --net=host 将使容器与宿主机共用端口(较少使用),可能导致容器内新启动的程序的端口会与宿主机发生冲突

使用bridge-utils进行网桥操作

安装:sudo apt-get install bridge-utils
验证:sudo brctl show
添加一个新的网桥:sudo brctl addbr mybr0 && sudo ifconfig mybr0 192.168.200.1 netmask 255.255.255.0

网络地址

修改dockers网络地址ip网段:sudo ifconfig docker0 192.168.192.1 netmask 255.255.255.0 && sudo service docker restart
修改docker使用的网桥为mybr0:
vim /etc/default/docker
在DOCKER_OPTS中添加参数 DOCKER_OPTS=" -b=mybr0 " ,重启docker service

容器互联LINK方式

默认是允许所有容器互相连接
使用给容器ip地址设置别名(不设置别名的情况下,默认设置下通过ip实际也能访问),避免重启ip变化:
容器1:docker run -it --name=c1 ubuntu:16.04
容器2连接容器1:docker run -it --name=c2 --link=c1:host1 ubuntu:16.04     在容器2内部输入命令env或者cat /etc/hosts可看到影响情况
修改默认互联规则为拒绝:DOCKER_OPTS中添加 --icc=false ,重启docker service
特定容器连接:DOCKER_OPTS中添加 --icc=false外,还需要 --iptables=true 让docker容器把配置添加到iptables设置中,并且容器需用--link选项,需先将iptables的设置清空(sudo iptables -F),并且重启启动docker,查看iptables设置(sudo iptables -L -n

容器互联BRIDGE方式

创建一个网桥:docker network create mysql-ms
指定网桥及网络别名启动
docker run -it --name=mysql-m1 --network=mysql-ms --network-alias=mysql-m1 uetty/mysql:5.7.23
docker run -it --name=mysql-s1 --network=mysql-ms --network-alias=mysql-s1 uetty/mysql:5.7.23

容器与外部网络连接

默认是允许与外部网络连接
通过sudo sysctl net.ipv4.conf.all.forwarding可查看系统ipforward值
设置禁止容器与外部网络连接DOCKER_OPTS添加 --ip-forward=false,重启docker service
设置容器(172.17.0.2)80端口不被特定ip(111.11.11.11)访问(通过iptables):sudo iptables -I DOCKER -s 111.11.11.11 -d 172.17.0.2 -p TCP --dport 80 -j DROP

远程镜像仓库

https://hub.docker.com/           docker官方仓库地址
docker search ubuntu             --automated=false true时只选中自动化构建出的镜像;--no-trunc=false true时不以截断的方式输出;-s或--stars=0 限制显示结果的最低星级
docker pull ubuntu:14.04            从远程拉取镜像
docker login           登陆远程镜像仓库,之后会提示输入账户和密码
docker push uetty/test:1.0            将镜像push到远程镜像仓库(须在docker hub创建有账户,并创建这个仓库,本地执行过登陆)

修改镜像仓库镜像地址加速拉取: 1. 修改: /etc/default/docker;2. 添加 DOCKER_OPTS="--registry-mirror=http://MIRROR-ADDR"
国内可以选择daocloud.io 注册账号后选择加速器生成链接:如:http://ae6fed91.m.daocloud.io

构建自己的镜像

通过commit容器的方式构建镜像

  1. 先从公共镜像仓库中拉曲一个ubuntu镜像:docker pull ubuntu:16.04
  2. 使用该镜像启动一个容器:docker run -d --name ubuntu-nginx ubuntu:16.04 /bin/bash
  3. 进入容器:docker exec -it ubuntu-nginx /bin/bash
  4. 安装自己的软件(nginx):apt-get update && apt-get install nginx
  5. 安装完毕后退出容器:ctrl + p && ctrl + q
  6. 提交容器生成镜像:docker commit -a "uetty" -m "nginx" b9fa70 uetty/nginx            生成镜像名为uetty/nginx(-a 作者信息;-m 镜像信息描述)
  7. 接下来有需要的话可以把镜像提交到远程仓库中

通过Dockerfile的方式构建镜像

前面入门操作->创建镜像并运行生成容器 中已经介绍

远程访问

需保证Client API与Server API版本一致,修改启动选项区别服务器

服务端(server_1)环境

修改启动选项sudo vim /etc/default/docker,输入
DOCKER_OPTS=" --label name=docker_server_1 -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock"    --label给服务器上标签,通过docker info可看到label值,-H 接受三种形式:tcp://host:port,unix:///path/to/socket(默认),fd://* or fd://socketfd,-H 可指定多个,为了保证本地客户端不被影响应加上unix方式
sudo service docker restart     重启生效
curl http://xx.xx.xx.xx:2375/info            检测
docker -H tcp://xx.xx.xx.xx:2375 info    客户端访问

客户端(server_2)远程连接

另一台服务器
export DOCKER_HOST="tcp://xx.xx.xx.xx:2375"       默认连接到远程服务端
docker info            可以从这里看到这时访问到远程服务端
export DOCKER_HOST=""            取消默认远程客户端

与宿主机进行地址映射与文件拷贝

docker run -d -v /data/volumes/ubuntu:/data --name ubuntu-nginx ubuntu:16.04 /bin/bash        将宿主机的/data/volumes/ubuntu 目录映射到容器/data目录
docker cp ubuntu-nginx:/a.txt a.txt             将容器内a.txt文件拷贝到宿主机
创建数据卷容器,并将数据卷容器挂载给其他容器
docker run -it -v /var/lib/mysql --name mysql-data ubuntu:16.04 /bin/bash           创建数据卷容器
docker run -it --volumes-from mysql-data --name mysql uetty/mysql:5.7.23 /bin/bash        挂载数据卷容器

其他操作命令一览

docker ps                        查看各镜像状态(无参数:列出运行的容器,-a:列出所有的容器,-l:列出最后运行的容器)
docker exec -it 8d43 /bin/bash            容器中启动新进程,异步方式进入docker容器命令行(如果容器构建使用的是/bin/sh,最后一个参数换成/bin/sh)
docker images            可看到uettydkr/test:1.0已进入现有镜像列表中
docker attach 8d43           附加到docker容器,同步方式进入容器命令行(如果某个客户端阻塞了,该方式进入也会被阻塞,因此不推荐)
docker inspect 8d43            列出容器json格式信息
ctrl+p && ctrl+q 退出交互式容器,容器不会停止运行(即先后按下ctrl + p ctrl + q两个命令)
docker logs 8d43            返回日志(默认返回所有日志,-f:持续返回日志,-t:返回的日志增加时间戳,--tail 10 指定显示最新的10条日志)
docker top 8d43            查看运行中容器的进程情况
docker info            查看docker信息,包括镜像存储位置
docker search java        从远程镜像仓库查找镜像