docker学习笔记整理
1、理解
1.1 docker 是什么
- 开源的软件部署解决方案
- 轻量级的应用容器框架
- 可以打包、发布、运行任何应用
1.2 docker 学习网站推荐
- 菜鸟网:https://www.runoob.com/docker/docker-tutorial.html
- docker中文网:http://www.docker.org.cn/book/docker/what-is-docker-16.html
- docker 源码:https://github.com/docker/docker-ce
1.3 docker 的核心概念
- 仓库(Repository)
- 用于存放镜像文件
- docker 仓库有很多个,如国内的阿里云、网易云、DaoCloud、国外的docker hub、Quay等,选择合适的仓库,可以提高资源获取效率 docker
- 仓库中存在很多不同的镜像,如:centos6、centos7、ubuntu10、buntu11、jeinkins、python、mysql、php、tomcat、apache等等
- 镜像(Image)
- 类似于rar、zip的压缩包,我们可以将一系列文件统一打包成一个压缩文件,方便传输、下载和使用
- 镜像文件是可读的;运行容器时,只是在镜像上面创建了一个可写层,而镜像本身不会发生变化
- 例如我们可以从 docker 仓库中下载 centos6、 jenkins 等镜像;
- 容器(container)
- 容器 = 镜像+ 读写层; 可以理解为 java 的类和对象, 镜像是类,容器是对象。
- 一个镜像可以创建很多个容器, 并且这些容器都可以独立运行,任何一个停掉也不会影响另一个
1.4 docker 的优点
- 高效构建应用——使用命名一键式部署
- 快速交付和部署——搭配jenkins持续集成
- 迁移扩展性强——将容器打包成镜像,移植到新的机器上
- 更新管理方便——使用可视化工具管理(如:protainer)
- 启动速度快——秒级
- 同时支持上千个容器
- 隔离性强——各个容器互不干扰
2、安装 (centos 为例)
- 安装所需软件包: yum install -y yum-utils device-mapper-persistent-data
lvm2 - 设置仓库:yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
- 安装Docker Engine-Community: yum install docker-ce docker-ce-cli containerd.io
- 列出可用版本: yum list docker-ce --showduplicates | sort -r
- 安装: yum install docker-ce-18.09.1 docker-ce-cli-18.09.1 containerd.io
- 启动docker: systemctl start docker
- 验证安装成功: docker run hello-world
3、容器使用常用命令
- 运行容器:docker run -i -t ubuntu:15.10 /bin/bash
- -i 交互式运行
- -t 终端模式
- -d 后台运行(不会进入容器) 如:docker run -d ubuntu:15.10 /bin/sh -c “while true; do echo working; sleep 60;done”
- -P 容器端口映射到主机随机端口
- -p 容器端口映射到主机指定一个端口 (如加了ip,则默认为 tcp 端口, 如果要绑定udp 端口, 需要在端口后加上 /udp)
- –name 命名容器
- –dns=8.8.8.8 指定dns
- 进入后台容器: docker attach 或者 docker exec ( exec 退出容器时,容器不会停止)
- 退出交互式容器:ctrl + D 或者 exit 退出交互式容器
- 启动容器: docker start name 或者 docker start id
- 停止容器: docker stop name 或者 docker stop id
- 重启容器: docker restart name 或者 docker restart id
- 导出容器: docker export 1e5 > /dev/ubuntu.tar
- 导入容器:cat /dev/ubuntu.tar | docker import - test/ubuntu:v1 (将
ubuntu.tar 导入到颈项 test/ubuntu:v1 - 导入容器: docker import http://example.com/exampleimage.tgz
example/imagerepo 通过URL 导入 - 删除容器:docker rm -f id (删除前要先停止运行)
- 清除所有终止的容器:docker container prune
- 端口查看: docker port id/name
- 查看状态: docker ps 或 docker ps -a (-a 展示所有运行过的容器 -l 显示最后一个运行的容器)
- 查看运行日志: docker logs name/id 或 docker logs -f name/id ( -f
持续标准输出) - 查看容器进程: docker top id/name
- 查看容器底层信息: docker inspect id/name
- 与宿主机传文件: docker cp container_id:/root/test /root (容器 拷贝到宿主机)
4、关于镜像的命令
- 列出本机镜像:docker images ( 使用 docker run 运行镜像)
- 预下载镜像: docker pull 镜像名
- 搜索镜像: docker search httpd
- 删除镜像: docker rmi hello-world
- 更新镜像: 进入容器终端,使用 apt-get update ; 然后退出终端,使用 docker commit -m=“comments” -a=“author” 容器id 目标镜像名 提交镜像
- 创建镜像:
1、 从已经创建的容器更新镜像,再提交;
2、使用 dockerfile 创建新镜像 - 构建镜像:创建Dockerfile 文件, 通过 docker build 执行Dockerfile 来构建镜像
$ cat Dockerfile
FROM centos:6.7
MAINTAINER Fisher "fisher@sudops.com"
RUN /bin/echo 'root:123456' |chpasswd
RUN useradd runoob
RUN /bin/echo 'runoob:123456' |chpasswd
RUN /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE 22
EXPOSE 80
CMD /usr/sbin/sshd -D
$ docker build -t runoob:centos:6.7 /root # /root 为Dockerfile 所在位置
- 设置镜像标签 : docker tag image_id tag_name
5、实例之运行一个web应用容器
$ docker pull training/webapp # 载入镜像
$ docker run -d -P training/webapp python app.py # -d 后台运行 -P 端口映射到主机的随机一个端口
$ docker ps
$ docker run -d -p 5000:5000 training/webapp python app.py # -p 端口映射到主机的指定一个端口
6、容器连接
$ docker network create -d bridge test-net # -d 指定网络类型为 bridge
# 后台运行2个容器 test1、 test2 ,指定网络为 test-net
$ docker run -id --name test1 --network test-net centos /bin/bash
$ docker run -id --name test2 --network test-net centos /bin/bash
# 查看test1、tesst2 运行正常
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
428af62a7e37 centos "/bin/bash" 7 minutes ago Up 7 minutes test2
879f20b21768 centos "/bin/bash" 7 minutes ago Up 7 minutes
test1
# 验证 test1、test2 网络互通
$ docker exec -it test1 /bin/bash
$ ping test2
7、 docker 可视化工具
这里推荐portainer (docker ui 没有账号权限控制,功能简单,没命令号; k8s 需要多台机器部署):
$ docker pull portainer/portainer
$ docker run -id --name protainer -p 9000:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer #单机版
$ #集群版:
$ docker run -id --name portainer -p 9000:9000 --restart=always portainer/portainer