Docker-docker的安装

CentOS7使用阿里云仓库安装docker-ce

# 卸载已安装的docker(如果以前安装过docker)
yum remove docker docker-common docker-selinux docker-engine -y
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
yum install docker-ce -y
systemctl enable docker

ubuntu 16.04 安装docker (阿里云镜像)

# step 1: 安装必要的一些系统工具
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# step 2: 安装GPG证书
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# Step 3: 写入软件源信息
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# Step 4: 更新并安装 Docker-CE
sudo apt-get -y update
sudo apt-get -y install docker-ce

# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# apt-cache madison docker-ce
#   docker-ce | 17.03.1~ce-0~ubuntu-xenial | http://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
#   docker-ce | 17.03.0~ce-0~ubuntu-xenial | http://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
# Step 2: 安装指定版本的Docker-CE: (VERSION 例如上面的 17.03.1~ce-0~ubuntu-xenial)
# sudo apt-get -y install docker-ce=[VERSION]

Docker 的参数

  • -t build的时候用-t可以打一个表情 docker build -t ailuoy/centos:7.1 .
  • images 查看所有镜像
  • --name 在run的时候可以个容器加一个别名

镜像的分类

  • 基础镜像 一般是系统
  • 中间件镜像 比如 php-fpm nginx mysql
  • 应用镜像 这个就是一个应用了...最终的生产环境镜像

Dockerfile

  • FROM 基础镜像
  • MAINTAINER 维护者
  • ENV 环境变量
  • VOLUME 挂载目录磁盘
  • ENTRYPOINT 启动的是一个脚本文件
  • ONBUILD 只会在下一个启动的时候执行

关于ONBUILD

php-fpm Dockerfile
....
ONBUILD ADD . /app
ONBUILD RUN chown -R nginx:nginx /app
wordpress Dockerfile
from csphere/php-fpm:5.4
....

因为肯定是先构建php-fpm,在构建wordpress,因为wordpress需要php-fpm来解析php代码,所以这里需要from csphere/php-fpm:5.4,那么这个时候php-fpm的 Dockerfile ONBUILD就生效了

ADD和COPY的区别

  • COPY只是复制
  • ADD的话,如果你是ADD的一个tar包,那么会帮你自动解压缩

RUN

  • 就是执行命令

EXPOSE

EXPOSE 22

docker暴露22号端口给宿主机,然后宿主机拿一个端口和22做映射

ENTRYPOINT

每次docker启动的时候执行的命令,, 如果有多个ENTRYPOINT那么只会执行最后一个

CMD

任何一个bash命令都会覆盖cmd命令

ENTRYPOINT和CMD的区别

为什么他两个要最对比...各自又是什么应用场景

docker run

  • docker run -it 启动交互式
  • docker run -d 在后台运行deamon
  • docker -p(小写p) 2222:22 指定映射端口,除非你把容器删除.端口释放
  • docker -P(大写P) 22 从宿主机中随机选一个未使用的端口和容器映射,如果容器重启之后..端口又会发生变化
  • docker --name {name} {容器名称} 给容器取一个名字

docker ps

查看当前在运行的容器

docker ps -a

查看所有容器

构建基础镜像

docker build -t csphere/centos:7.1 .

后台启动 csphere/centos:7.1 镜像 并取名为 base 同时映射本地端口2222到容器端口22

docker run -d -p 2222:22 --name base csphere/centos:7.1

构建中间件

docker build -t csphere/php-fpm:7.2 .
docker run -d -p 8080:80 --name website csphere/php-fpm:5.4

进入容器

  • dr exec -it {容器名称} /bin/bash
  • dr exec -it {容器名称} bash

dr run -d -p 3306:3306 -v host_dir:container_dir --name dbserver csphere/mysql:5.5

  • host_dir 本地目录
  • container_dir 容器目录

docker run -d -p 3306:3306 -v /var/lib/docker/vfs/dir/mydata:/var/lib/mysql --name newdb csphere/mysql:5.5

数据挂载到本地磁盘 /var/lib/docker/vfs/dir/mydata

dr run -d -p 80:80 --name wordpress -e WORDPRESS_DB_HOST=10.211.55.22 -e WORDPRESS_DB_USER=admin -e WORDPRESS_DB_PASSWORD=csphere2015 csphere/woldpress:4.2

.dockerignore

这个文件和git的.ignore文件效果一样忽略文件 在部署项目的时候,我们需要在项目更目录下写一个Dockerfile来启动容器 但是又不希望这个文件提交到代码,这时候就靠 .dockerignore 了

错误

Exited (1) 3 seconds ago

# 查看日志然后解决问题
docker logs -f container_id

MySQL Connection Error: (2003) Can't connect to MySQL server on '127.0.0.1' (111)

原因是我起了一个mysql,然后我用wordpress去连接mysql 这时候我用的ip是宿主机的内网ip 但是却一直连接不上

查看mysql容器ip

docker inspect {容器ID} | grep IPAddress
➜  scripts git:(master) ✗ docker inspect add40dea39c7 | grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.4",
                    "IPAddress": "172.17.0.4",

OCI runtime exec failed: exec failed: ...

OCI runtime exec failed: exec failed: container_linux.go:348: starting container process caused "exec: \"bash\": executable file not found in $PATH": unknown

原因是该容器并没有bash,所以尝试用sh

docker exec -it xxx sh

步骤

  • 安装docker-ce 启动
  • build基础镜像->run基础镜像

https://yq.aliyun.com/articles/583765

脚本一键拉起所有服务

docker run -d -p 2222:22 --name base csphere/centos:7.1

docker run -d -p 3306:3306 -v /var/lib/docker/mysql:/var/lib/mysql --name newdb csphere/mysql:5.5

docker run -d -p 80:80 --name wordpress -e WORDPRESS_DB_HOST=172.17.0.4 -e WORDPRESS_DB_USER=admin -e WORDPRESS_DB_PASSWORD=csphere2015 csphere/woldpress:4.2

网络

检查iptales

iptables -t nat -L -n

可以看到NAT模式的掩码是:172.17.0.0

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  172.17.0.0/16        0.0.0.0/0

我这里启动了三个容器,所以这里就对应了三个

Chain DOCKER (2 references)
target     prot opt source               destination
RETURN     all  --  0.0.0.0/0            0.0.0.0/0
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:2222 to:172.17.0.2:22
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:3306 to:172.17.0.3:3306
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80 to:172.17.0.4:80

如果没有supervisor守护的话.. 要ctrl+p ctrl+q来退出,这样容器才不会挂掉

更换网络模式

  • NAT
  • HOST 共享主机
  • other container 容器直接共享网络
  • none 没有任何网络(需要自行配置)
  • overlay 跨主机通讯

host

dr run -it --name csphere-host --net=host busybox sh

container

创建A容器
dr run -it --name csphere-con  busybox sh

创建B容器

dr run -it --name csphere-con2 --net=container:csphere-con  busybox sh

删除所有容器

dr rm -f $(dr ps -a -q)

需要请教运维小哥哥的问题

  • 比如启动一个nginx的容器,那么 日志和配置 怎么挂载
  • 是不是我个人用host网络就可以了

使用阿里docker源

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://o3trwnyj.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker