base Ubuntu 16.04
简单入门操作
安装
sudo apt-get remove docker docker-engine docker-ce docker.io
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common (使apt能接受https的ppa库)
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - (docker官方GPG密钥)
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" (ppa库,这个地址好像不是很好用,在某些网络下会失败,成功率与各自网络有关。出现网络问题的话,有条件的同学可以考虑科学上网)
sudo apt-get update
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 退出交互式容器,容器不会停止运行(先后按下这两个命令)
exit 对交互式容器会退出
docker logs 8d43 返回日志(默认返回所有日志,-f:持续返回日志,-t:返回的日志增加时间戳,--tail 10 指定显示最新的10条日志)
docker top 8d43 查看运行中容器的进程情况
docker info 查看docker信息,包括镜像存储位置
docker search java 从远程镜像仓库查找镜像