Docker学习整理

docker 容器
阿里云docker安装脚本:curl -sSL http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-engine/internet | sh -
DaoCloud 的安装脚本:curl -sSL https://get.daocloud.io/docker | sh
镜像:特殊的文件系统,由多层文件系统组成,提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)
容器:容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。容器的实质是进程,容器可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。
仓库:集中的存储、分发镜像的服务,一个仓库会包含同一个软件不同版本的镜像


安装:
1.获取docker-ce(社区版)源:
wget http://mirrors.aliyun.com/repo/Centos-7.repo
wget http://mirrors.163.com/.help/CentOS7-Base-163.repo
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
2.加速缓存: yum makecache fast
3.安装docker-ce : yum -y install epel-release
yum -y install docker-ce
4.启动docker :systemctl enable docker
systemctl start docker
5.添加内核参数 :tee -a /etc/sysctl.conf <<-EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl -p
6.添加镜像加速器 : vim /etc/docker/daemon.json
{
"registry-mirrors": [
"https://registry.docker-cn.com"
]
}
或者:vim /var/lib/systemd/system/docker.service
--insecure-registry=0.0.0.0:5000
7.重启docker :systemctl daemon-reload
systemctl restart docker

8.安装依赖包:yum install -y yum-utils device-mapper-persistent-data lvm2
9.添加用户和组:groupadd docker
usermod -aG docker $USER
10.测试;docker run hello-world

镜像image:
8.列出镜像 :docker image ls
8.查找镜像 :docker search centos
9.获取镜像 :docker pull IP:5000/ubuntu(仓库名):16.04(标签)
9.打标签镜像 :docker tag ubuntu:17.10(原有) IP:端口/ubuntu:17.10
docker push username/ubuntu:17.10

10.运行镜像 :docker run -it --rm ubuntu:16.04 bash :-i交互式操作, -t终端, bash执行一些命令并查看返回结果,
--rm :这个参数是说容器退出后随之将其删除
11.查看系统版本 :cat /etc/os-release
13.查看镜像占用空间 :docker system df
14.查看虚悬镜像 :docker image ls -f dangling=true


15.删除虚悬镜像 :docker image prune
16.删除镜像(一般做法) ,一个镜像可能指向多个标签: docker image rm 镜像ID/镜像名
17.精确删除镜像 :docker image ls --digests redis
docker image rm node@sha 或 docker image rm $(docker image ls -q redis)
18.列出指定范围的ID列表 :docker image ls -q

运行镜像 : docker run --name webserver -d -p 80:80 nginx :用 nginx 镜像启动一个容器,命名为 webserver ,并且映射了 80 端口
20.修改Nginx主页 : docker exec -it webserver bash
echo '<h1>hello,Docker!</h1>' > /usr/share/nginx/html/index.html
21.查看镜像改动 : docker diff webserver
22.保存镜像 :docker commit --author "Huang <hcf@gmail.com>" --message "change web html" webserve nginx:v2
23.查看镜像内历史记录 :docker history nginx:v2
24.运行定制镜像 : docker run --name=web2 -it --rm -p 8080:8080 nginx:v2
docker run -p 8008:8080 tomcat

Dockerfile定制镜像;创建Dockerfile文件,
FROM nginx (以哪个镜像为基础)
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html (每一个RUN行为都会创建一层镜像,有多个时用&&)
25.在Dockerfile目录下构建 : docker build -t nginx:v3 .



容器:
26.查看容器 :docker container ls
27.停止容器 :docker container stop 容器ID
socker stop $(docker ps -q)
28.启动容器 : docker container start 容器ID
29.进入容器 : (1)attach (退出时会停止容器)
docker run -dit ubuntu :-d,容器启动进入后台
docker container ls
docker attach 容器ID
(2)exec(退出时不会停止容器)
docker run -dit ubuntu
docker container ls
docker exec -it 容器ID /bin/bash(不加t没有终端)
30.导出容器 :docker export 容器ID > 容器名.tar
31.删除容器 : docker container rm 容器ID
32.导入容器 :cat 容器.tar | docker import - 容器名:v1.0
33.清理所有停止状态的容器 :docker container prune

仓库(本地):31.创建存放镜像仓库目录 :mkdir /opt/data
32.安装仓库工具 :docker run -d -p 5000:5000 -v /opt/data/registry(指定路径):/var/lib/registry(默认路径) registry
38.配置加速器 :vim /etc/docker/daemon.json
vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.12.28:5000

39.重启 :systemctl daemon-reload
systemctl restart docker.service
33.自定义镜像 :docker tag centos:latest 127.0.0.1:5000/centos:latest
35.上传镜像 :docker push 127.0.0.1:5000/centos:latest
36.查看 :curl 192.168.12.199:5000/v2/
http://192.168.12.199:5000/v2(仓库版本)/_catalog
37.下载镜像 :docker pull 127.0.0.1:5000/ubuntu:latest
38. find / -name config.yml
39. filesystem:
rootdirectory: /var/lib/registry
delete:
enabled: true
40.删除仓库镜像:curl -XGET http://192.168.11.196:5000/v2/httpd/tags/list
curl -v -H "Accept: application/vnd.docker.distribution.manifest.v2+json" -X HEAD http://192.168.11.196:5000/v2/httpd/manifests/v1
curl -XDELETE 192.168.11.196:5000/v2/httpd/manifests/sha256:6c2906f645126a744fdb79031b02d419fa977f8479174c0b63ca45513247cd1a


数据卷:
34.查看数据卷 :docker volume ls
35.创建数据卷 ;docker volume create my-vol
36.查看指定数据卷 :docker volume inspect my-vol
37.删除数据卷 :先停容器,删容器,再删数据卷 :docker volume rm
38.挂载数据卷 :docker run -d -P --name web --mount source=my-vol,target=/webapp training/webapp python app.py
39.挂载只读数据卷 :docker run -d -P --name web --mount type=bind,source=/src/webapp,target=/opt/webapp,readonly training/webapp python app.py
40.挂载本地数据卷到镜像 :docker run -it -v /usr/share/logstash/data:/usr/share/logstash/data:rw logstash:v1 /bin/bash

网络:
40.查看容器端口映射 :docker container ls
41.将本地端口5000映射到容器端口5000 :docker run -d -p 5000:5000 training/webapp python app.py
42.查看映射端口配置 : docker container ls
docker port nostalgic_morse 5000
43.创建docker网络 : docker network create -d bridge my-net
44.运行一个容器并连接到网络 :docker run -it --rm --name busybox1 --network my-net busybox sh
45.运行第二个容器连接到网络 :docker run -it --rm --name busybox2 --network my-net busybox sh

docker-compose:是用来组装多容器应用的工具,可以在 Swarm集群中部署分布式应用。
46.获取二进制包 :curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
47.给予执行权限 : chmod +x /usr/local/bin/docker-compose
48.compose项目包含三部分 :app.py, Dokcerfile, docker-compose.yml(version,services,web,build,ports,redis,image....)
49.运行compose项目 : docker-compose up
50.查看日志 :docker logs -f -t --tail 行数 容器名

docker-machine :是支持多平台安装Docker的工具,使用 Docker Machine,可以很方便地在笔记本、云平台及数据中心里安装Docker。
49.安装virtualbox驱动:
[virtualbox]
name=Oracle Linux/RHEL/CentOS-$releasever/$basearch-VirtualBox
baseurl=http://download.virtualbox.org/virtualbox/rpm/el/$releasever/$basearch
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://www.virtualbox.org/download/oracle_vbox.asc
50.查找virtualbox:yum search virtualbox
50.安装最新版:yum -y install VirtualBox-5.2.x86_64
50.初始化:/sbin/vboxconfig
51.安装内核:yum -y install kernel-devel kernel-devel-3.10.0-862.el7.x86_64
50.初始化:/sbin/vboxconfig
50.安装 :curl -L https://github.com/docker/machine/releases/download/v0.15.0/docker-machine-`uname -s`-`uname -m` >/tmp/docker-machine && install /tmp/docker-machine /usr/local/bin/docker-machine
51查看版本 :docker-machine -v
52.创建docker管理主机 :docker-machine create -d virtualbox manager

docker-swarm集群:
一、单节点主机使用virtualbox驱动创建集群:
1.创建docker管理主机 :docker-machine create -d virtualbox manager
--engine-opt dns=114.114.114.114 配置 Docker 的默认 DNS
--engine-registry-mirror https://registry.docker-cn.com 配置 Docker 的仓库镜像
--virtualbox-memory 2048 配置主机内存
--virtualbox-cpu-count 2 配置主机 CPU
2.查看管理主机环境: docker-machine env manager
3.远程到管理主机 :docker-machine ssh manager
4.初始化IP:docker swarm init --advertise-addr 192.168.99.100(记住返回秘钥信息,用于加入集群认证)
5.创建工作节点:docker-machine create -d virtualbox worker1
6.登录到工作主机 :docker-machine ssh worker1
7.加入集群 :docker swarm join --token SWMTKN-1-6blwl0474odjjsln41geym4n87ba4czrmy00ojn6h5k2nm20mc-b9llptcgnc23wrhtyk7nr9wda 192.168.99.100:2377
8.查看连接令牌:docker swarm join-token manager
8.查看集群节点:docker-machine ls
9.删除:docker-machine rm -f $(docker-machine ls -q)
9.查看leader节点:docker node ls
10.删除swarm集群: docker swarm leave --force
11.删除节点:docker node rm worker1
12.管理节点部署Nginx :docker service create --replicas 3(docker主机数) -p 80:80 --name nginx nginx:1.13.7-alpine(版本)
13.查看服务(管理) :docker service ls / docker service ps nginx
14.启动服务 :docker service update 服务名
15.查看日志 :docker service logs nginx
16.扩容服务(容器) :docker service scale nginx=5(先分给manager,再给worker)
docker service ps nginx
17.收缩服务(容器) :docker service scale nginx=2
docker service ps nginx
18.删除服务(容器) :docker service rm nginx
19.docker-swarm部署compose: docker stack deploy -c docker-compose.yml wordpress
20.查看docker-compose服务: docker stack ls
21.删除服务 : docker stack rm
22.swarm集群管理敏感数据 : openssl rand -base64 20 | docker secret create mysql_password -
openssl rand -base64 20 | docker secret create mysql_root_password -
23.查看密码 :docker secret ls
24.创建MySQL服务 : docker network create -d overlay mysql_private
25.升级 : docker service update --image nginx:1.13.12-alpine nginx
26.回退 :docker service rollback nginx

二、多节点主机swarm集群
获取yum源: # cd /etc/yum.repos.d/
# mv CentOS-Base.repo CentOS-Base.repo.bak
# wget http://mirrors.aliyun.com/repo/Centos-7.repo
# wget http://mirrors.163.com/.help/CentOS7-Base-163.repo
# yum clean all
# yum makecache
安装网络工具和基础包:# yum install net-tools checkpolicy gcc dkms foomatic openssh-server bash-completion -y
修改hostname:# hostnamectl --static set-hostname c1
设置免密登录:# ssh-keygen
# vi /etc/ssh/sshd_config
RSAAuthentication yes
   PubkeyAuthentication yes
   AuthorizedKeysFile .ssh/authorized_keys
#ssh-copy-id c1
#ssh-copy-id c2
安装docker:# mkdir -p ~/_src
&& cd ~/_src
&& wget http://yum.dockerproject.org/repo/main/centos/7/Packages/docker-engine-selinux-1.12.3-1.el7.centos.noarch.rpm
&& wget http://yum.dockerproject.org/repo/main/centos/7/Packages/docker-engine-1.12.3-1.el7.centos.x86_64.rpm
&& wget http://yum.dockerproject.org/repo/main/centos/7/Packages/docker-engine-debuginfo-1.12.3-1.el7.centos.x86_64.rpm
&& yum localinstall -y docker-engine-selinux-1.12.3-1.el7.centos.noarch.rpm docker-engine-1.12.3-1.el7.centos.x86_64.rpm docker-engine-debuginfo-1.12.3-1.el7.centos.x86_64.rpm
# docker version
# systemctl enable docker && systemctl start docker
修改docker配置文件:# vi /lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -s=overlay --registry-mirror=https://7rgqloza.mirror.aliyuncs.com --insecure-registry=localhost:5000 -H unix:///var/run/docker.sock --pidfile=/var/run/docker.pid
# systemctl daemon-reload && systemctl restart docker.service
开启防火墙端口:# firewall-cmd --zone=public --add-port=2377/tcp --permanent &&
firewall-cmd --zone=public --add-port=7946/tcp --permanent &&
firewall-cmd --zone=public --add-port=7946/udp --permanent &&
firewall-cmd --zone=public --add-port=4789/tcp --permanent &&
firewall-cmd --zone=public --add-port=4789/udp --permanent &&
firewall-cmd --reload
# firewall-cmd --list-ports
初始化swarm:# docker swarm init --advertise-addr 192.168.11.199(c1的ip)
c2加入集群
设置c2为主节点:# docker swarm leave
c1: # docker swarm join-token manager



docker集中化web管理平台
一、shipyard
1.启动docker,下载镜像
# systemctl restart docker
# docker pull alpine
# docker pull microbox/etcd
# docker pull library/rethinkdb
# docker pull shipyard/docker-proxy
# docker pull swarm
# docker pull shipyard/shipyard

2.下载shipyard脚本
# wget https://raw.githubusercontent.com/shipyard/shipyard-project.com/master/site/themes/shipyard/static/deploy
# bash deploy
# http://192.168.11.199:8080

3.优点
# 支持镜像管理、容器管理。
# 支持控制台命令
# 容器资源消耗监控
# 支持集群swarm,可以随意增加节点
# 支持控制用户管理权限,可以设置某个容器对某个用户只读、管理权限。
# 有汉化版
4.缺点
# 启动容器较多,占用每个节点的一部分资源
# 兼容性性不高,可能是我自身原因,经常打不开首页。

二、portainer
1.下载镜像
docker pull docker.io/portainer/portainer

2.启动
# docker run -d -p 9000:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --name prtainer-test portainer/portainer
# http://192.168.11.199:9000

3.优点
# 支持容器管理、镜像管理
# 轻量级,消耗资源少
# 基于docker api,安全性高,可指定docker api端口,支持TLS证书认证。
# 支持权限分配
# 支持集群
4.缺点
# 功能不够强大。
# 容器创建后,无法通过后台增加端口。

三、dockerUI
1.下载镜像
# docker pull uifd/ui-for-docker

2.启动
# docker run -it -d --name docker-web -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock docker.io/uifd/ui-for-docker
# http://192.168.11.199:9000
3.优点
# 支持容器管理
# 支持镜像管理
# 基于docker api,自身也是一个容器。
# 稳定性高
# 可动态显示显示容器之间关系图
# 容器管理,增加端口映射,增加系统变量、映射目录等
4.缺点
# 没有登录验证,因为没有登录体系,目前解决办法是,只开放本地访问,或者通过TLS来对权限进行控制。
# 无法分配某容器给某用户。
# 不支持多主机。
# 不支持集群swarm等
# 功能少
# 不支持控制台命令

etcd : 是 CoreOS 团队发起的一个管理配置信息和服务发现的项目,它的目标是构建一个高可用的分布式键值( key-value )数据库,端口号2379 、2380
下载: curl -L https://github.com/coreos/etcd/releases/download/v3.2.10/etcd-v3.2.10-linux-amd64.tar.gz -o etcd-v3.2.10-linux-amd64.tar.gz
解压: tar zxvf etcd-v3.2.10-linux-amd64.tar.gz
进入相关目录: cd etcd-v3.2.10-linux-amd64
拷贝到可执行目录: cp etcd* /usr/local/bin/
启动服务: etcd
检查是否启动成功: etcdctl member list
设置环境变量: echo 'export ETCDCTL_API=3' >>/etc/profile
测试: etcdctl put testkey(键) "hello world"(值)
获取: etcdctl get testkey

docker中 启动所有的容器命令
docker start $(docker ps -a | awk '{ print $1}' | tail -n +2)

docker中 关闭所有的容器命令
docker stop $(docker ps -a | awk '{ print $1}' | tail -n +2)

docker中 删除所有的容器命令
docker rm $(docker ps -a | awk '{ print $1}' | tail -n +2)

docker中 删除所有的镜像
docker rmi $(docker images | awk '{print $3}' |tail -n +2)


Dockerfile命令
1.FROM :指定基础镜像(必须第一条)
2.RUN :运行指定命令
3.CMD :容器启动时运行的命令
4.LABEL :为镜像指定标签
5.MAINTAINER : 指定作者
6.EXPOSE : 暴露容器运行时监听端口给外部
7.ENV :指定环境变量
8.ADD :复制,将文件复制到镜像中
9.COPY :复制
10.ENTRYPOINT : 启动时的默认命令
11.VOLUME : 将内地文件夹或者其他容器种得文件夹挂在到这个容器中
12.USER :设置启动容器的用户,可以是用户名或UID
13.WORKDIR :设置工作目录,对RUN,CMD,ENTRYPOINT,COPY,ADD生效。如果不存在则会创建,也可以设置多次。
14.ARG :设置变量命令
15.ONBUILD : 这个命令只对当前镜像的子镜像生效。
16.STOPSIGNAL : 当容器推出时给系统发送什么样的指令
17.HEALTHCHECK : 容器健康状况检查命令
18.docker history 镜像名 : 逆向查看dockerfile构建过程


Docker-compose命令
1. version :指定版本号
2. services :服务
3. build :指定 Dockerfile 所在文件夹的路径
4. cap_add :指定容器的内核能力(capacity)分配。
5. command :覆盖容器启动后默认执行的命令。
6. container_name :指定容器名称
7. devices :指定设备映射关系。
8. depends_on :解决容器的依赖、启动先后的问题
9. dns :自定义 DNS 服务器。可以是一个值,也可以是一个列表
10. dns_search :配置 DNS 搜索域。可以是一个值,也可以是一个列表。
11. tmpfs :挂载一个 tmpfs 文件系统到容器。
12. env_file :从文件中获取环境变量,可以为单独的文件路径或列表。
13. environment :设置环境变量
14. expose : 暴露端口,但不映射到宿主机,只被连接的服务访问。
15. image :指定为镜像名称或镜像 ID。如果镜像在本地不存在, Compose 将会尝试拉取这个镜像。
16. labels :为容器添加 Docker 元数据(metadata)信息
17. logging :配置日志选项。
18. network_mode :设置网络模式。
19. networks :配置容器连接的网络。
20. pid :跟主机系统共享进程命名空间。打开该选项的容器之间,以及容器和宿主机系统之间可以通过进程 ID 来相互访问和操作。
21. ports :暴露端口信息。使用宿主端口:容器端口 (HOST:CONTAINER) 格式,或者仅仅指定容器的端口(宿主将会随机选择端口)都可以。
22. secrets :存储敏感数据。
23. sysctls :配置容器内核参数。
24. ulimits :指定容器的 ulimits 限制值。
25. volumes :数据卷所挂载路径设置
26. deploy : 指定与部署和运行服务相关的配置

原文地址:https://www.cnblogs.com/jay-fred/p/9956304.html