- 0.完全清华镜像
```
如果你之前安装过 docker,请先删掉:
sudo yum remove docker docker-common docker-selinux docker-engine
安装一些依赖:
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
下载适配centos系统的源:
wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
把软件仓库地址替换为 TUNA(清华大学):
sudo sed -i 's+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo
最后安装:
sudo yum makecache fast
sudo yum install -y docker-ce
```
- 1.卸载老版本
```
1.
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
2.
a. yum list installed | grep docker输出:docker-ce.x86_64 ……docker-ce-cli.x86_64
b. 删除安装的软件包
yum -y remove docker-ce.x86_64yum -y remove docker-ce-cli.x86_64
c. 删除镜像/容器等
rm -rf /var/lib/docker/
d/ 输入docker或docker –version验证是否卸载
docker --version打印出:-bash: /usr/bin/docker: No such file or directory
```
- 2.安装
```
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
```
- 2.5 用阿里的镜像
```
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
```
- 3.添加repo
```
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
```
- 3.5可选安装:(Optional: Enable the edge and test repositories)
```
$ sudo yum-config-manager --enable docker-ce-edge
---
$ sudo yum-config-manager --enable docker-ce-test
```
- 3.8更新yum缓存
```
sudo yum makecache fast
```
- 4.INSTALL DOCKER CE
```
sudo yum install docker-ce
---安装完成!
```
- 5.Start Docker
```
sudo systemctl start docker
```
- 5.5更换镜像
```
vim /etc/docker/daemon.json
{
"registry-mirrors": ["http://ef017c13.m.daocloud.io"],
"live-restore": true
}
或者
{
"registry-mirrors": ["https://3zfwxe4j.mirror.aliyuncs.com"]
}
systemctl daemon-reload
```
- 6.CentOS安装Docker-Machine(MAC不用,Win另类安装)
```
$ curl -L https://github.com/docker/machine/releases/download/v0.15.0/docker-machine-$(uname -s)-$(uname -m) >/tmp/docker-machine &&
chmod +x /tmp/docker-machine &&
sudo cp /tmp/docker-machine /usr/local/bin/docker-machine
or
base=https://github.com/docker/machine/releases/download/v0.14.0 &&
curl -L $base/docker-machine-$(uname -s)-$(uname -m) >/tmp/docker-machine &&
sudo install /tmp/docker-machine /usr/local/bin/docker-machine
```
- 6.5docker-compose
```
sudo curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
```
- 7.用到的命令
- docker image ls // 列出docker里面的镜像
- docker pull redis/mysql // 下载docker的实例
- docker run hello-world // 运行一个docker实例
- docker container ls ( -a) == docker ps -a // 列举出来当前的容器(所有的容器(包括容器的信息),包括正在运行的和已经退出的)
- docker rm dcf3d8f7a529 (删除上一步查询出来的容器Id)
- docker container ls -aq (查询出所有容器的id,只有id)
- docker rm $(docker container ls -aq) 批量删除 所有的容器
- docker run -it centos // 交替运行Centos
- docker commit CONTAINER_NAMES CONTAINER_ID/Centos-vim // 将某个docker(container的名称)创建成一个image镜像(container的id/新名称)
- docker history IMAGE_ID // 查看这个镜像Image的演进过程
- docker image rm IMAGE_ID 删除某个镜像
- docker rename oldContainerName newContainerName //修改容器的名称
- Dockerfile
- 新建一个文件夹,vim一个文件名为:Dockerfile
- 编辑内容为
```
FROM centos // 表示基础环境
RUN yum install -y vim // 表示打包安装一个东西进去
```
- docker build -t songxiankun2008/centos-vim-new .
// 执行打包生成image的命令 后面的`.`表示执行当前目录下的Dockefile里面的命令
- [x] 接下来就会根据Dockerfile里面的命令进行分步骤执行,在安装的过程中会临时生成一个Docker的Container的ID;在安装完成的时候会删除这个临时Container的ID,再生成一个全新可用的ID
- FROM (//为了安全尽量使用官方的image作为制作的image)
- FROM scratch # 制作base image
- FROM centos # 使用base image
- FROM ubantu:14.04
- LABEL (作者等描述信息)
- LABEL maintainer = "songxiankun2018@gmail.com"
- LABEL version = "1.0"
- LABEL description = "This is description"
- Metadata 不可少 ! (类似注释)
###### RUN
-
```
RUN yum update && yum install -y vim \ python-dev # 反斜线换行
```
-
```
RUN apt-get update && apt-get install -y perl \ pwgen --no-install-recommends && rm -rf \
var/lib/apt/lists/*
```
-
```
RUN /bin/base -C 'source $HOME/.bashrc;echo $HOME'
```
<code>RUN</code>为了美观,复杂的RUN请用==反斜线换行==!避免无用分层,合并多条命令成一行!
###### WORKDIR (设定当前目录)
```
WORKDIR /root
```
```
WORKDIR /test #如果没有会自动创建test目录
WORKDIR demo
RUN pwd #输出结果应该是 /test/demo
```
- 用 ++WORKDIR++,不要用<code>RUN cd</code>!
- 尽量使用绝对目录
###### ADD and COPY
- 这两个的意思是将文件放到Docker容器中去;
add与copy的区别是,add可以在添加的过程中执行一些动作;
- 大部分情况<code>copy</code>优于<code>add</code>,add除了copy还有额外的功能(解压),添加远程文件/目录请使用curl或者wget!
eg:
```
ADD hello /
```
```
ADD test.tar.gz / #添加到根目录并解压
```
```
WORKDIR /root
ADD hello test/ #即路径为: /root/test/hello
```
```
WORKDIR /root
COPY hello test/
```
###### ENV
```
ENV MYSQL_VERSION 5.6 #设置常量
RUN apt-get install -y mysql-server= "{MYSQL_VERSION" && rm -rf /var/lib/apt/lists/* #引用常量
```
- 尽量使用ENV增加可维护性!
###### VOLIME and EXPOSE
(存储和网络)
###### CMD and ENTRYPOINT
- CMD:
- 容器启动时默认执行的命令
- 如果docker run指定了其他命令,CMD命令被忽略
- 如果定义了多个CMD,只有最后一个会执行
eg:
```
FROM centos
ENV name Docker
CMD echo "hello $name"
```
那么build这个DockerFile,并运行这个容器的话会输出“hello Docker”
docker run [image] 会输出 hello Docker 【满足上面第一点条件】
Docker run -it [image] /bin/bash 输出的话,则不会输出...【满足上面第二点条件,指定了/bin/bash命令,则就不会执行前面的命令,所以就不会输出该输出的那段话】
- ENTRYPOINT:
- 让容器以应用程序或者服务的形式运行
- 不会被忽略,一定会执行
- 最佳实践:写一个shell脚本作为entryPoint
```
COPY docker-entrypoint.sh /usr/local/bin/
ENTRYPOINT ["docker-entrtpoint.sh"]
EXPOSE 27017
CMD ["mongod"]
```
- 其中<code>EXPOSE 27017</code>是将端口
---
- 交互式的进入一个已经运行的容器中去执行命令:
<code>docker exec -t containerId /bin/bash</code>
- 查看container详细的信息:
<code>docker inspect containerId</code>
- 查看Docker运行过程中的一些输出,或者是日志
<code>Docker logs ContainerId</code>
###### stress [压力测试]
先在系统中安装stress,eg:ubantu:<code>apt-get update && apt-get install -y stress</code>
1. stress -vm 1 [打印出普通日志]
2. stress -vm 1 --verbose [打印出debug的日志,较多]
- 启动容器的时候就调试日志
docker run -it war3sxkcs/ubantu-stress --vm 1 --verbose
其中<code>--vm 1 --verbose</code>相当于类似在<code>cmd</code>中运行的
#### Docker Network
单机:
- Bridge Network
- Host Network
- None Network
多机:
- Overlay Network
##### 数据持久化之Data Volume
Volume字段可以将Docker里面的数据输出到linux本地eg:
VOLUME /var/lib/mysql
建议启动方式:
docker run -v mysql:/var/lib/mysql
##### 数据持久化之==bind Mounting== (++可实时的同步源文件++)
<code>bind Mounting</code>与<code>Data Volume</code>的区别在于:
- Data Volume需要在docker容器里面进行定义
- bind Mounting不需要在容器里面定义。只需要在docker容器启动的时候,在启动命令中指定linux实际路径与docker里面的路径即可.eg:<code>docker run -v /home/aaa:/root/aaa</code>
Dockerfile再次实战:
- <code>Dockerfile</code>
```
# this same shows how we can extend/change an existing official image from Docker Hub
FROM nginx:latest
# highly recommend you always pin versions for anything beyond dev/learn
WORKDIR /usr/share/nginx/html
# change working directory to root of nginx webhost
# using WORKDIR is prefered to using 'RUN cd /some/path'
COPY index.html index.html
# I don't have to specify EXPOSE or CMD because they're in my FROM
```
- <code>index.html</code>
```
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>hello</title>
</head>
<body>
<h1>Hello Docker! </h1>
</body>
</html>
```
---
- 编译<code> docker build -t war3sxkcs/docker-nginx .</code>
- 启动<code> docker run -d -p 80:80 --name web war3sxkcs/docker-nginx</code>
(-d 是表示后台运行,-p是表示指定端口与外界的端口映射。--name web ,是给该启动的容器取一个别名叫做web)
- 启动起来过后,因为容器里面的80端口是映射到容器内部的80端口的,所以直接在linux本地访问80端口,就能够访问到刚刚的<code>index.html</code>
- linux访问当前80端口:<code>curl 127.0.0.1</code>,即可查看当前页面.
- 现在删除掉这个容器即(docker rm -f web)。用“-v”参数来启动这个容器,是表示linux本地的一个文件与docker容器中的一个文件进行同步。
- 所以新的启动命令就是<code>docker run -d -v $(pwd):/usr/share/nginx/html -p 80:80 --name web war3sxkcs/dockernginx</code>,这个启动命令只是比之前的那个启动命令多了个“-v”参数. $(pwd)是指当前环境致成变量传入,当前的路径就是index.html所在的这个路径
- 然后再交互式运行到docker里面去查看docker里面的index.html的变化。即<code>docker exec -it web /bin/bash </code>
- 此时无论在linux中修改index.html还是在docker中修改这个index.html文件,这两个文件都是同步的。并且修改了保存后可以直接访问,没有需要再去重启什么的
###### 6-1 wordpress
- 启动 mysql
```
docker run -d --name mysql -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=wordpress mysql
```
- -d:后台启动
- -v:映射到本地路径
- -e:环境变量的设置
- -p:端口映射
- <code>MYSQL_ROOT_PASSWORD</code>这个和<code>MYSQL_DATABASE</code>是来源于Docker的hub上的关于mysql的文档专门写的有,账号和密码都是root
关于在容器中调用mysql的其他demo:
```
docker run --name some-wordpress --link some-mysql:mysql -d wordpress
```
- 启动 wordpress
```
docker run -d -e WORDPRESS_DB_HOST=mysql:3306 --link mysql -p 8080:80 wordpress
```
###### 6-3 docker-compose
- <code></code>
- <code>docker-compose up</code>:启动一个compose。前提是在当前文件夹下面有一个<code>docker-compose.yml</code>文件,否则的话就只能指定这个文件<code>docker-compose /home/docker-compose.yml up</code>。这一套命令是适用于debug模式,会输出一些日志的
- 常规默认启动情况下是用后台启动的方式启动:<code>docker-compose up -d</code>
- <code>docker-compose ps </code>是查看当前的环境中有几个service存在
- <code>docker-compose start</code>开始所有被停止的compose
- <code>docker-compose stop</code>停止所有活跃的compose
- <code>docker-compose down</code>停止当前运行的compose,并将其容器一并删除,同时也会删除bridge网桥连接,并不会删除image
- <code>docker-compose images</code>查看compose定义的image
- exec [用法与docker container 类似]
- docker-compose exec [serviceName] bash
- eg: <code>docker-compose exec mysql base</code>
- 此处的mysql即serviceName来自于docker-compose.yml中的service的名称
- <code>docker network ls </code>查看compose的网络状况[网桥链接之类的]
###### 6-4 水平扩展和负载均衡
将docker里面的某个service复制多份,达到负载均衡和高可用的效果。
即: <code>docker-compose --scale serviceName = 3 -d </code>意思是将当前docker-compose.yml里面的[serviceName]复制成三份,(如果docker-compose.yml里面的端口号没有删除的话,这个命令是要报错的。所以在执行这个命令的时候需要将docker-compose.yml里面的port端口号删除。但是执行这个命令之前,需要先将这个docker-compose不删除端口的启动起来)
![image](https://sxk.s3.didiyunapi.com/pic/docker/docker.png)
这三个一样的service的端口号都是同一个端口,比如port:5000。上图中,HAproxy会访问中间那一块用5000端口,那么中间那一块的N个会自动权衡哪个web去处理,又返回到后面的redis。[HAProxy是一个负载均衡器]
在中间的那N个,每次处理的时候都不是同一个在处理,而是以此循环轮训的来调用其中的一个来处理
network如果没有指定的话,那一般就是<code>bridge</code>网络
###### 6-5 一个复杂的投票应用
```
services:
voting-app:
build: ./voting-app/.
volumes:
- ./voting-app:/app
ports:
- "5000:80"
links:
- redis
networks:
- front-tier
- back-tier
result-app:
build: ./result-app/.
volumes:
- ./result-app:/app
ports:
- "5001:80"
links:
- db
networks:
- front-tier
- back-tier
worker:
build: ./worker
links:
- db
- redis
networks:
- back-tier
redis:
image: redis
ports: ["6379"]
networks:
- back-tier
db:
image: postgres:9.4
volumes:
- "db-data:/var/lib/postgresql/data"
networks:
- back-tier
volumes:
db-data:
networks:
front-tier:
back-tier:
```
<code>docker-compose up = docker-compose up && docker-compose run</code>
###### 7. Dokcer编排工具swarm
++7.2 - 7.3++
评论区