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
posted @ 2019-08-05 22:37  彼时岸边  阅读(172)  评论(0编辑  收藏  举报