Docker
Ubuntu 安装 Docker
使用脚本自动安装
在测试或开发环境中 Docker 官方为了简化安装流程,提供了一套便捷的安装脚本,Ubuntu 系统上可以使用这套脚本安装:
$ curl -fsSL get.docker.com -o get-docker.sh
sh get-docker.sh --mirror AzureChinaCloud
# 可能会出现 404 错误,请移步下面的特别说明
//$ sudo sh get-docker.sh --mirror Aliyun
执行这个命令后,脚本就会自动的将一切准备工作做好,并且把 Docker CE 的 Edge 版本安装在系统中。
特别说明
2018 年 7 月 21 日,貌似阿里云这边在做调整,故导致 Docker 的 Aliyun 安装脚本不可用,是永久性还是临时性的尚不清除,如果你已经按照之前的操作安装 Docker,请按以下步骤进行修复并重新安装
- 如果已经使用了 Aliyun 脚本安装并成功的
- 请先卸载 Docker,命令为:apt-get autoremove docker-ce
- 删除 /etc/apt/sources.list.d 目录下的 docker.list 文件
- 使用 AzureChinaCloud 镜像脚本重新安装,命令为:
sudo sh get-docker.sh --mirror AzureChinaCloud
测试 Docker 是否安装正确
$ docker version
能出现service和client
Docker 镜像加速器
Ubuntu 16.04+、Debian 8+、CentOS 7
对于使用 systemd 的系统,请在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件)
{
"registry-mirrors": [
"https://registry.docker-cn.com"
]
}
之后重新启动服务。
$ systemctl daemon-reload
$ systemctl restart docker
检查加速器是否生效
配置加速器之后,如果拉取镜像仍然十分缓慢,请手动检查加速器配置是否生效,在命令行执行 docker info,如果从结果中看到了如下内容,说明配置成功。
Registry Mirrors:
https://registry.docker-cn.com/
Docker Compose 安装
curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
注意,这里第一步可能下载不下来,需要从https://github.com/docker/compose/releases手动下载,把文件放到/usr/local/bin/目录下。
卸载
如果是二进制包方式安装的,删除二进制文件即可。
$ sudo rm /usr/local/bin/docker-compose
获取镜像
从 Docker 镜像仓库获取镜像的命令是 docker pull。其命令格式为:
docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
- Docker 镜像仓库地址:地址的格式一般是 <域名/IP>[:端口号]。默认地址是 Docker Hub。
- 仓库名:如之前所说,这里的仓库名是两段式名称,即 <用户名>/<软件名>。对于 Docker Hub,如果不给出用户名,则默认为 library,也就是官方镜像。
比如:
$ docker pull ubuntu:16.04
上面的命令中没有给出 Docker 镜像仓库地址,因此将会从 Docker Hub 获取镜像。而镜像名称是 ubuntu:16.04,因此将会获取官方镜像 library/ubuntu 仓库中标签为 16.04 的镜像。
列出已下载的镜像
docker images
删除镜像
docker rmi [选项] <镜像1> [<镜像2> ...]
or
docker image rm [选项] <镜像1> [<镜像2> ...]
删除虚悬镜像
docker image prune
运行
有了镜像后,我们就能够以这个镜像为基础启动并运行一个容器。以上面的 ubuntu:16.04 为例,如果我们打算启动里面的 bash 并且进行交互式操作的话,可以执行下面的命令。
$ docker run -it --rm \
ubuntu:16.04 \
bash
- -it:这是两个参数,一个是 -i:交互式操作,一个是 -t 终端。我们这里打算进入 bash 执行一些命令并查看返回结果,因此我们需要交互式终端。
- --rm:这个参数是说容器退出后随之将其删除。默认情况下,为了排障需求,退出的容器并不会立即删除,除非手动 docker rm。我们这里只是随便执行个命令,看看结果,不需要排障和保留结果,因此使用 --rm 可以避免浪费空间。
- ubuntu:16.04:这是指用 ubuntu:16.04 镜像为基础来启动容器。
- bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 bash。
以交互的形式启动ubuntu:16.04容器,容器退出后随之将其删除,这里exit可以用快捷键 ctrl +D
交互的形式进入容器
docker exec -it
查看正在运行的容器
docker ps
查看所有的容器
docker ps -A
删除容器
docker rm
docker rm -f 强制删除容器
docker container prune 将所有未运行的容器删除
停止容器
docker stop 容器id
重启容器
docker restart 容器id
守护进程
docker run -p 8080:8080 --name tomcat -d tomcat
docker run -p 8081:8080 --name tomcat1 -d tomcat
此时启动两个Tomcat,分别的8080 和8081,对应宿主机的8080
Dockerfile 定制镜像
在一个空白目录中,建立一个文本文件,并命名为 Dockerfile:
cd /usr/local/
mkdir docker
mkdir tomcat
$ vi Dockerfile
其内容为:
FROM tomcat
//进入root文件夹
WORKDIR /usr/local/tomcat/webapps/ROOT/
//删除root文件夹所有内容
RUN rm -fr *
//写入index.html
RUN echo '<h1>Hello, Docker!</h1>' > /usr/local/tomcat/webapps/ROOT/index.html
构建镜像
$ docker build -t myshop .
这里的 .是在指定上下文目录。 是打包当前目录,实际操作是把当前目录打包成一个压缩包,把压缩包以及docker build发送给服务端,服务端接受指令,解压该压缩包。解压出来的文件所在的目录称为上下文目录。这时docker images可以看到myshop镜像
运行构建的镜像(tomcat)
docker run -p 80:8080 myshop
or
docker run -P myshop
宿主机的80端口映射到服务器的8080端口。EXPOSE 暴露端口,CMD 启动镜像中的程序。
Dockerfile 指令详解
Dockerfile COPY 复制文件
格式:
- COPY <源路径> <目标路径>
切换到镜像目录的root文件夹
WORKDIR /usr/local/tomcat/webapps/ROOT
删除该目录的全部文件
RUN rm -fr *
把项目拷贝到该目录,左边是上下文的文件路径,右边是镜像的目录
COPY my-shop-admin.zip .
解压传过去的压缩包
RUN unzip my-shop-admin.zip
解压完该压缩包就没有用了,所以解压完就把删了
RUN rm -fr my-shop-admin.zip
把工作目录切换到Tomcat
WORKDIR /usr/local/tomcat
数据卷
主要用于数据持久化
Docker 构建 tomcat
可以共享宿主机资源,数据存在宿主机,这样如果容器删除了,数据并不会丢失
docker run -p 8080:8080 --name tomcat -d -v /usr/local/docker/tomcat/ROOT:/usr/local/tomcat/webapps/ROOT tomcat
查看数据卷
docker volume ls
查看容器tomcat日志的方式
docker logs tomcat
- -p 8080:8080:将容器的8080端口映射到主机的8080端口
- -v -v /usr/local/docker/tomcat/ROOT:/usr/local/tomcat/webapps/ROOT tomcat:将主机中当前目录下的ROOT挂载到容器的/ROOT
这里是一守护态(-d)启动一个端口为8080的tomcat,(-v)左边是宿主机资源的位置,右边是容器中资源的位置。Tomcat举例:
- 如果宿主机的/usr/local/docker/tomcat/ROOT中只有一个index.html。容器中/usr/local/tomcat/webapps/ROOT目录下的文件也
只有一个index.html。 - 如果再创建一个tomcat1,共享root,tomcat1中的root也有index.html,由此实现资源共享。
此时只要把项目拷贝到宿主机的tomcat ROOT目录,便可以实习持久化保存。比如:
cp myshop.zip ROOT/
cd ROOT
unzip myshop.zip
Docker 构建 mysql
拉取官方镜像
docker pull mysql:5.7.22
运行容器
docker run -p 3306:3306 --name mysql \
-v /usr/local/docker/mysql/conf:/etc/mysql \
-v /usr/local/docker/mysql/logs:/var/log/mysql \
-v /usr/local/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7.22
注意,此时mysql的配置并没有生效,所以我们需要把mysql的配置持久化到数据卷
- 删除掉之前的容器,重新创建一个容器,此时先不带第二行的配置
docker rm -f mysql
docker run -p 3306:3306 --name mysql \
-v /usr/local/docker/mysql/logs:/var/log/mysql \
-v /usr/local/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7.22
- 以交互的形式进入容器
docker exec -it mysql bash
- 进入容器中的/mysql.conf.d发现是有配置的,这里面的mysqld.cnf配置文件需要追加一条"max_allowed_packet = 128M"
cd /etc/mysql/mysql.conf.d/
- 回到容器的上级mysql目录
cd ..
- 进入mysql的conf.d文件夹,发现有cat mysqldump.cnf配置
cd conf.d
- 打印mysqldump.cnf,把它的配置复制出来
cat mysqldump.cnf
"max_allowed_packet = 128M"
- 重新进入容器的mysql.conf.d/文件夹
cd /etc/mysql/mysql.conf.d/
- 在mysqld.cnf的最后面追加之前复制的 "max_allowed_packet= 128M"
echo "max_allowed_packet= 128M" >>mysqld.cnf
- ctrl D 退出容器,重启容器,此时初始数据128m内的数据库便可以导入了
docker restart mysql
- 因为配置是放在容器中,并没有实现持久化,所有此时我们需要把容器中的配置拷贝到宿主机中,在重新根据数据卷的配置创建容器,实现数据持久化
查看容器中配置的存放位置
docker exec -it mysql bash
cd /etc/mysql/
pwd
- 先进入到宿主机的conf文件夹,然后拷贝mysql容器中的/etc/mysql目录到宿主机的conf文件夹
docker cp mysql:/etc/mysql .
- 进入宿主机的conf/mysql目录,把复制下来的所有配置文件移动到上级conf目录,删除空白的mysql文件夹
cd mysql
mv *.* ..
rm -fr mysql
- 删除容器,重新运行容器,这次运行的是带有配置的
docker rm -f mysql
docker run -p 3306:3306 --name mysql \
-v /usr/local/docker/mysql/conf:/etc/mysql \
-v /usr/local/docker/mysql/logs:/var/log/mysql \
-v /usr/local/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7.22
Docker Compose 使用
Docker Compose 安装
curl -L https://github.com/docker/compose/releases/download/1.17.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
注意,这里第一步可能下载不下来,需要从https://github.com/docker/compose/releases手动下载,把文件放到/usr/local/bin/目录下。
卸载
如果是二进制包方式安装的,删除二进制文件即可。
$ sudo rm /usr/local/bin/docker-compose
- 编写 docker-compose.yml 文件,这个是 Compose 使用的主模板文件
cd /usr/local/docker/
mkdir mywebsite
cd mywebsite/
vi docker-compose.yml
version: '3'
services:
web:
restart: always
image: tomcat
container_name: web
ports:
- 8080:8080
volumes:
- /usr/local/docker/mywebsite/ROOT:/usr/local/tomcat/webapps/ROOT
mysql:
restart: always
image: mysql:5.7.22
container_name: mysql
ports:
- 3306:3306
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 123456
command:
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
--lower_case_table_names=1
--max_allowed_packet=128M
--sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO"
volumes:
- mysql-data:/var/lib/mysql
volumes:
mysql-data:
此时的数据库文件在 cd /var/lib/docker/volumes下
- 查看数据卷
docker volume ls
出现
local mywebsite_mysql-data
- 启动
docker-compose up
//守护态运行
docker-compose up -d
- 删除
docker-compose down
- 看日志
docker-compose logs tomcat
//监听
docker-compose logs -f tomcat