概述

  • Docker 运行在 CentOS 7 上,要求系统为64位、系统内核版本为 3.10 以上。
  • Docker 运行在 CentOS-6.5 或更高的版本的 CentOS 上,要求系统为64位、系统内核版本为 2.6.32-431 或者更高版本。

CentOS7 Docker 安装

Docker 要求 CentOS 系统的内核版本高于 3.10

  1. # uname -r 命令查看你当前的内核版本
  2. [root@izadux3fzjykx7z ~]# uname -r
  3. 安装一些必要的系统工具:
  4. [root@izadux3fzjykx7z ~]# sudo yum install -y yum-utils device-mapper-persistent-data lvm2
  5. 添加软件源信息:
  6. [root@izadux3fzjykx7z ~]# sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  7. 更新 yum 缓存:
  8. [root@izadux3fzjykx7z ~]# sudo yum makecache fast
  9. 安装 Docker-ce
  10. [root@izadux3fzjykx7z ~]# sudo yum -y install docker-ce

启动 Docker 后台服务

  1. [root@izadux3fzjykx7z ~]# sudo systemctl start docker
  2. 测试运行 hello-world
  3. [root@izadux3fzjykx7z ~]# docker run hello-world



本地没有hello-world这个镜像,所以会下载一个hello-world的镜像,并在容器内运行

镜像加速

鉴于国内网络问题,后续拉取 Docker 镜像十分缓慢,我们可以需要配置加速器来解决,我使用的是网易的镜像地址:http://hub-mirror.c.163.com。

新版的 Docker 使用 /etc/docker/daemon.json(Linux) 来配置 Daemon。

请在该配置文件中加入(没有该文件的话,请先建一个):

  1. {
  2. "registry-mirrors": ["http://hub-mirror.c.163.com"]
  3. }

删除 Docker CE

  1. $ sudo yum remove docker-ce
  2. $ sudo rm -rf /var/lib/docker

Docker常用命令

列出本地镜像: docker images

  1. docker images -a :列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层);
  2. docker images --digests :显示镜像的摘要信息;
  3. docker images -f :显示满足条件的镜像;
  4. docker images --format :指定返回值的模板文件;
  5. docker images --no-trunc :显示完整的镜像信息;
  6. docker images -q :只显示镜像ID

docker pull : 从镜像仓库中拉取或者更新指定镜像

  1. docker pull -a :拉取所有 tagged 镜像
  2. docker pull --disable-content-trust :忽略镜像的校验,默认开启
  3. docker pull java : 下载java最新版镜像
  4. docker pull -a java

docker inspec 获取容器/镜像的详细信息

  1. docker inspec 94errf55dter
  2. docker inspec 镜像ID -f :指定返回值的模板文件。
  3. docker inspec 镜像ID -s :显示总的文件大小。
  4. docker inspec 镜像ID --type :为指定类型返回JSON

docker search : 从Docker Hub查找镜像

  1. docker search mysql
  2. --automated :只列出 automated build类型的镜像;
  3. --no-trunc :显示完整的镜像描述;
  4. -s :列出收藏数不小于指定值的镜像。

docker rmi : 删除本地一个或多少镜像(容器)

  1. docker rmi mysql
  2. -f :强制删除;
  3. --no-prune :不移除该镜像的过程镜像,默认移除;

docker ps : 列出容器

  1. -a :显示所有的容器,包括未运行的。
  2. -f :根据条件过滤显示的内容。
  3. --format :指定返回值的模板文件。
  4. -l :显示最近创建的容器。
  5. -n :列出最近创建的n个容器。
  6. --no-trunc :不截断输出。
  7. -q :静默模式,只显示容器编号。
  8. -s :显示总的文件大小。

如何创建一个镜像

创建镜像的方法又三种:基于已有镜像的容器创建,基于本地模板导入,基于Dockerfile创建

docker commit :从容器创建一个新的镜像

  1. docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
  2. -a :提交的镜像作者;
  3. -c :使用Dockerfile指令来创建镜像;
  4. -m :提交时的说明文字;
  5. -p :在commit时,将容器暂停。

首先启动一个镜像 为容器重新分配一个伪输入终端 以交互模式运行容器

  1. docker run -ti ubuntu:14.04 /bin/bash
  2. # 运行后启动进入命令 记住容器ID
  3. root@97cc221196d7:/#
  4. # 创建一个test文件 并退出
  5. root@97cc221196d7:/# touch test
  6. root@97cc221196d7:/# exit
  7. # 此时容易和原来的相比已经发生改变, 可以docker commit提交一个新的镜像,提交时用ID或名称指定容器
  8. docker commit -m "add a new file is name test" -a "qxw" 97cc221196d7 test
  9. #成功返回新的镜像ID
  10. sha256:342175794310960ce0b0932bb05b818fb4abc2bcc5d29824018d7783f83d76a9
  11. # 再次查看镜像列表
  12. [root@izadux3fzjykx7z ~]# docker images
  13. REPOSITORY TAG IMAGE ID CREATED SIZE
  14. test latest 342175794310 2 minutes ago 188MB
  15. ubuntu 14.04 390582d83ead 5 weeks ago 188MB
  16. hello-world latest fce289e99eb9 3 months ago 1.84kB

存储和载入镜像

可以使用docker savedocker load来存储和载入镜像

docker save : 将指定镜像保存成 tar 归档文件

  1. # 保存咋当前目录下
  2. docker save -o test.tar test

docker load: 载入一个镜像

  1. docker load --input test.tar

  2. docker load < test.tar

上传镜像

docker push : 将本地的镜像上传到镜像仓库,要先登陆到镜像仓库

  1. # 可以先添加新的标签 user/test:latest 然后用docker push 上传
  2. docker tag test:latest user/test:latest
  3. docker push user/test:latest
  4. ## 第一次使用会提示登录信息或注册

容器的基本操作

容器是镜像的一个实例,所不同的是,它带有额外的可写文件层

创建容器

docker create :创建一个新的容器但不启动它

  1. [root@izadux3fzjykx7z ~]$ docker create -it ubuntu:14.04
  2. 1140d5e5a0a6b9d79adc053fc5d359209e860bf474327a52b3a8da5337173c74

新建并启动容器

  1. [root@izadux3fzjykx7z ~]$ docker run ubuntu:14.04 /bin/echo 'hello world'
  2. hello world

后台启动一个容器运行

  1. [root@izadux3fzjykx7z ~]$ docker run -d ubuntu /bin/sh -c "while true;do echo hello word;sleep 1;done"
  2. [root@izadux3fzjykx7z ~]$ docker ps
  3. CONTAINER ID IMAGE
  4. 47168308c196 ubuntu
  5. #获取容器的输出信息
  6. [root@izadux3fzjykx7z ~]$ docker logs 471

终止容器

  • docker stop 命令来中止一个运行中的容器,它会向容器发送信号,等待一段时间后在发送信号终止器
  • docker kill 命令会直接中止容器
  1. [root@izadux3fzjykx7z ~]$ docker stop 471
  2. 471

查看处于中止状态的容器ID

  1. [root@izadux3fzjykx7z ~]$ docker ps -a -q
  2. 47168308c196
  3. 97765732ff5a

处于中止的容器 可以用过 docker start 重新启动

  1. [root@izadux3fzjykx7z ~]$ docker start 471
  2. 471

重启一个容器

  1. [root@izadux3fzjykx7z ~]$ docker restart 471
  2. 471

如何进入容器

  • docker attach :连接到正在运行中的容器。
  • 当多个窗口同时attach 到同一个容器时,所有窗口都会同步显示,如果某个窗口操作的命令阻塞了,所有的窗口都会阻塞
  1. [root@izadux3fzjykx7z ~]$ docker attach 471
  2. hello word
  3. hello word
  4. hello word
  • docker exec:在运行的容器中执行命令。可以直接进入容器操作命令
  1. [root@izadux3fzjykx7z ~]$ docker exec -ti 47168308c196 /bin/bash
  2. root@47168308c196:/$ ls -l
  3. drwxr-xr-x 2 root root 4096 Mar 7 21:01 bin
  4. drwxr-xr-x 2 root root 4096 Apr 24 2018 boot

删除容器

  • 可以使用docker rm 命令删除处于终止状态的容器。命令为 docker rm
  • -f ,–force=false 强行终止并删除一个运行中的容器
  • -l,–link=false 删除容器的链接 但保留容器
  • -v,–volumes=false, 删除容器挂载的数据券
  1. [root@izadux3fzjykx7z ~]$ docker ps -a
  2. CONTAINER ID IMAGE COMMAND CREATED
  3. 8714bb6a3cee hello-world "/hello" 4 hours ago
  4. [root@izadux3fzjykx7z ~]$ docker rm 8714 docker rm -f 8714
  5. 8714

导入和导出容器

  • docker export :将文件系统作为一个tar归档文件导出。不管这个容器是否处于运行状态
  1. [root@izadux3fzjykx7z ~]$ docker export 47168 > test_stop.tar
  2. [root@izadux3fzjykx7z ~]$ ls -l
  3. -rw-r--r-- 1 root root 72308736 Apr 19 14:59 test_stop.tar
  • 导出的容器可以使用docker import导入成为镜像
  1. [root@izadux3fzjykx7z ~]$ cat test_stop.tar | docker import - test/ubuntu:v1.0
  2. sha256:c6c6209a648fd9520fb3a9b3cfcec5f9e53bf82aeffcc2e9edba01942f7c9100
  3. [root@izadux3fzjykx7z ~]$ docker images
  4. REPOSITORY TAG IMAGE ID CREATED SIZE
  5. test/ubuntu v1.0 c6c6209a648f 5 seconds ago 69.8MB
  • 既可以使用docker load命令导入一个镜像文件。也可以使用docker import导入一个容器快照到本地镜像库。两者的区别在于:快照文件将丢弃所有的历史记录和元数据信息。而镜像存储文件将保存完整记录。体积也要大。从容器快照文件导入时可以重新指定标签等元数据信息。

创建和使用私有仓库

  • 官方提供了registry镜像来搭建一套本地私有仓库的环境
  • -v 用户指定镜像文件存储的路径 默认路径是容器的 /tmp/registry目录下
  1. # 自动下载并启动一个registry容器 创建一个本地私有仓库
  2. [root@izadux3fzjykx7z ~]$ docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry
  3. # 此时本地将启动一个私有仓库,监听端口为5000

然后在本地电脑上安装一个docker 上传镜像到服务器

  1. #首先使用docker命令标记一个镜像格式为
  2. docker tag hello-world 39.108.144.143:5000/hellp-world
  3. #使用docke push 上传至服务器
  4. docker push 39.108.144.143:5000/hellp-world
  • Docker从1.3.X之后,与docker registry交互默认使用的是https,然而此处搭建的私有仓库只提供http服务,所以当与私有仓库交互时就会报上面的错误

  • 这个问题需要在启动docker server时增加启动参数为默认使用http访问。修改daemon.json文件
  1. {
  2. "registry-mirrors": ["http://hub-mirror.c.163.com"],
  3. "insecure-registries":["39.108.144.143:5000"]
  4. }

查看镜像推送结果:curl http:39.108.144.143:5000/v1/search

下载私有仓库镜像: docker pull 39.108.144.143:5000/hellp-world

数据管理

  • 容器中管理数据主要有两种方式: 数据卷,数据卷容器

数据卷

数据卷是一个可供容器使用的特许目录,它绕过文件系统,可以提供很多有用的特性

  • 数据卷可以在容器之间共享和重用
  • 对数据卷的修改会立即生效
  • 对数据卷的更新,不会影响镜像
  • 卷会一直存在,直到没有容器使用。数据卷的使用类似Linux目录下或文件mount操作。

如何在容器中创建一个数据卷

  1. # 使用training/webapp创建一个web容器,并创建一个数据卷挂载到容器的/webapp目录
  2. [root@izadux3fzjykx7z ~]$ docker run -d -P --name web -v /webapp training/webapp python app.py
  3. - P :只允许外部访问容器需要暴露的端口
  4. -v :也可以指定挂载一个本地的已有目录到容器中去作为数据卷
  5. # 加载主机的src/webapp目录到容器opt/webapp 目录下
  6. docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py
  7. # docker 挂载数据默认权限是读写(rw),可以通过ro 指定为只读
  8. docker run -d -P --name web -v /src/webapp:/opt/webapp ro training/webapp python app.py
  9. # 挂载一个本地主机文件作为数据卷,记录在容器中输入过的命令历史
  10. docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash

数据卷容器

  • 如果需要在容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。
  • 数据卷容器其实就是一个普通的容器,专门用它提供数据卷 供其它容器挂载使用
  1. # 创建数据卷容器 ,并在其中创建一个数据卷挂载到 /dbdat
  2. [root@izadux3fzjykx7z ~]#
  3. root@3266a5692131:/# ls
  4. bin boot dbdata dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
  5. # 然后,可以在其它容器中使用 --volumes-from来挂载dbdata容器中的数据卷。
  6. # 创建db1和db2两个容器,并从dbdata 容器挂载数据卷
  7. docker run -it --volumes-from dbdata --name db1 ubuntu
  8. docker run -it --volumes-from dbdata --name db2 ubuntu
  9. # 进入dbdata容器 并创建一个文件夹
  10. [root@izadux3fzjykx7z ~]# docker run -it -v /dbdata --name 3266a ubuntu
  11. root@74d186f5896d:/# cd /dbdata/
  12. root@74d186f5896d:/dbdata# touch test
  13. root@74d186f5896d:/dbdata# ls
  14. test
  15. # 在db1容器中查看它
  16. [root@izadux3fzjykx7z ~]# docker run -it --volumes-from dbdata --name d822cd ubuntu
  17. d186f5896d:/dbdata# ls
  • 如果删除了挂载的容器,数据卷不会自动删除,如果要删除一个数据卷,必须删除最后一个还挂着它的容器时显示使用docker rm -v命令来指定同时删除关联的容器
  • 使用容器卷可以让用户在容器之间自由升级和移动数据卷

网络基础配置

  • 使用-P标记时,Docker会随机映射一个端口
  1. [root@izadux3fzjykx7z ~]# docker run -d -P --name fe9531 -v /webapp training/webapp python app.py
  2. 4fd207fa931ff015a0c659219d1f7dcc787c353e5ab1f49afaf506472b9e82d2
  3. [root@izadux3fzjykx7z ~]# docker logs -f 4fd20
  4. * Running on http://0.0.0.0:5000/ (Press CTRL+#
  5. # 将本地5000端口 映射到容器的5000端口
  6. [root@izadux3fzjykx7z ~]# docker run -d -p 5000:5000 training/webapp python
  7. # 映射到指定地址的指定端口
  8. [root@izadux3fzjykx7z ~]# docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
  9. # 查看端口映射
  10. [root@izadux3fzjykx7z ~]# docker port ea1ecbd4dda4
  11. 5000/tcp -> 127.0.0.1:5000

Dockerfile命令语法

  • Dockerfile 是由一行行命令组成,一般二言分为四部分:基础镜像信息,维护者信息,镜像操作指令和容器启动时指令

FROM

  • 功能为指定基础镜像,并且必须是第一条指令。
  • 如果不以任何镜像为基础,那么写法为:FROM scratch。
  • 同时意味着接下来所写的指令将作为镜像的第一层开始
  1. 语法:
  2. FROM <image>
  3. FROM <image>:<tag>
  4. FROM <image>:<digest>
  5. 三种写法,其中<tag>和<digest> 是可选项,如果没有选择,那么默认值为latest

MAINTAINER

  • 构建指令,用于将image的制作者相关的信息写入到image中

RUN

镜像操作指令。RUN命令有两种格式

  1. RUN <command>
  2. RUN ["executable", "param1", "param2"]
  3. # 两种写法比对:
  4. RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME
  5. RUN ["/bin/bash", "-c", "echo hello"]
  • 第一种后边直接跟shell命令。在linux操作系统上默认 /bin/sh -c
  • 在windows操作系统上默认 cmd /S /C
  • 第二种是类似于函数调用。可将executable理解成为可执行文件,后面就是两个参数。

CMD

  • 容器启动时要运行的命令。语法有三种写法:
  1. CMD ["executable","param1","param2"]
  2. CMD ["param1","param2"]
  3. CMD command param1 param2
  4. # 举例说明两种写法:
  5. CMD [ "sh", "-c", "echo $HOME"
  6. CMD [ "echo", "$HOME" ]
  • 第三种比较好理解了,就时shell这种执行方式和写法
  • 第一种和第二种其实都是可执行文件加上参数的形式
  • 这里边包括参数的一定要用双引号,就是",不能是单引号。千万不能写成单引号。原因是参数传递后,docker解析的是一个JSON array

LABEL

  • 功能是为镜像指定标签.。LABEL会继承基础镜像种的LABEL,如遇到key相同,则值覆盖
  1. 语法:
  2. LABEL <key>=<value> <key>=<value> <key>=<value> ...
  3. #一个Dockerfile种可以有多个LABEL,如下:
  4. LABEL "com.example.vendor"="ACME Incorporated"
  5. LABEL com.example.label-with-value="foo"
  6. LABEL version="1.0"
  7. LABEL description="This text illustrates \
  8. that label-values can span multiple lines."
  9. #但是并不建议这样写,最好就写成一行,如太长需要换行的话则使用\符号
  10. LABEL multi.label1="value1" \
  11. multi.label2="value2" \
  12. other="value3"

创建支持SSh的服务镜像

基于commit 命令创建

  1. # 首先创建一个容器
  2. [root@izadux3fzjykx7z ~]# docker run -it ubuntu:14.04 /bin/bash
  3. # 尝试使用SSHD命令 发现没有安装该服务
  4. [root@03e74d026566:/# sshd
  5. bash: sshd: command not found
  6. # 更新软件源信息
  7. root@03e74d026566:/# apt-get update
  8. # 安装和配置SSh服务
  9. root@03e74d026566:/# apt-get install openssh-server
  10. #要正常启动SSH服务 需要手动创建并启动它
  11. root@03e74d026566:/# mkdir -p /var/run/sshd
  12. root@03e74d026566:/# /usr/sbin/sshd -D &
  13. [1] 3848
  14. #查看容器22的端口已经处于监听状态
  15. root@2173083a66ec:/# netstat -tunlp
  16. Active Internet connections (only servers)
  17. Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
  18. tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 3026/sshd
  19. tcp6 0 0 :::22 :::* LISTEN 3026/sshd
  20. # 修改SSH服务的安全登录配置,取消pam登录限制
  21. root@2173083a66ec:/# sed -ri 's/session required pam_loginuid.so/#session required pam_loginuid.so/g' /etc/pam.d/sshd
  22. # 在用户目录下创建.ssh目录 并复制需要登录的公匙信息到authorized_keys文件中(一般为本地主机目录用户下的.ssh/id_rsa.pub文件中 可由ssh-keygen -t rsa 命令生成)
  23. root@2173083a66ec:/# mkdir root/.ssh
  24. root@2173083a66ec:/# vi /root/.ssh/authorized_keys
  25. # 创建自动启动SSH服务的可执行文件 并添加可执行权限
  26. root@2173083a66ec:/# vi /run.sh
  27. #!/bin/bash
  28. /usr/sbin/sshd -D
  29. root@2173083a66ec:/# chmod +x run.sh
  30. # 最后退出保存容器
  31. root@2173083a66ec:/# exit
  32. # 保存为一个新镜像
  33. [root@izadux3fzjykx7z ~]# docker commit 217 sshd:ubuntu
  34. sha256:043bbe1d3ca0429fa5e00e1ce35e0f3d666cc303393ca09b2776bef81be3085a
  35. # 使用镜像启动容器 并添加端口映射 10022->22
  36. [root@izadux3fzjykx7z ~]# docker run -p 10022:22 -d sshd:ubuntu /run.sh
  37. 0aabe835d56311abdc7ab1febf293a15b5240128a927a8638635b204203deb4b
  38. # 在宿主机上测试连接ssh
  39. [root@izadux3fzjykx7z ~]# ssh 172.18.83.251 -p 10022

使用Dockerfile创建

首先应创建一个sshd_ ubuntu 工作目录:

  1. $ mkdir sshd ubuntu
  2. # 在其中,创建Dockerfile和run.sh文件:
  3. $ cd sshd_ ubuntu/
  4. $ touch Dockerfile run. sh
  5. # 编写run.sh脚本和authorized keys文件
  6. # 文件run.sh的内容与上-小节中致:
  7. #!/bin/bash
  8. /usr/sbin/sshd -D
  9. # 在宿主主机上生成SSH密钥对,并创建authorized keys 文件:
  10. $ ssh-keygen -t rsa
  11. $ cat ~/.ssh/id_ rsa. pub >authorized keys

编写Dockerfile文件

  1. #设置继承镜像
  2. FROM ubuntu:14.04
  3. #提供一些作者的信息
  4. MAINTAINER from blog.qinxuewu.club by qxw (870439570@qq.com)
  5. # 下面开始运行命令,此处更改ubuntu的源为国内163的源
  6. RUN echo "deb http:/ /mirrors.163. com/ubuntu/ trusty main restricted universe
  7. multiverse" > /etc/apt/ sources.list
  8. RUN echo "deb http://mirrors. 163. com/ubuntu/”trusty-security main restricted
  9. universe multiverse" >> /etc/apt/sources.list
  10. RUN echo
  11. "deb http://mirrors.163. com/ubuntu/ trusty-updates main restricted
  12. universe multiverse" >> /etc/apt/sources.list
  13. RUN echo "deb http://mirrors. 163. com/ubuntu/ trusty-proposed main restricted
  14. universe multiverse" >> /etc/apt/sources.list
  15. RUN echo "deb http: //mirrors.163. com/ubuntu/ trusty-backports main restricted
  16. universe multiverse" >> /etc/apt/sources.list
  17. RUN apt-get update
  18. #安装ssh服务
  19. RUN apt-get install -y openssh-server
  20. RUN mkdir -p /var/ run/sshd
  21. RUN mkdir -P /root/ .ssh
  22. #取消pam限制
  23. RUN sed -ri 's/session required pam loginuid.so/#session required pam_ loginuid.so/g' /etc/pam.d/sshd
  24. # 复制配置文件到相应位置,并赋予脚本可执行权限
  25. ADD authorized keys /root/ .ssh/authorized keys
  26. ADD run.sh /run.sh
  27. RUN chmod 755 /run.sh
  28. #开放端口
  29. EXPOSE 22
  30. 普设置自启动命令
  31. CMD ["/run. sh"]

创建镜像

  1. #在sshd_ ubuntu 目录下,使用docker build 命令来创建镜像。注意一下,在最后还有一个“.”,表示使用当前目录中的Dockerfile.
  2. $ cd sshd ubuntu
  3. $ sudo docker build -t sshd:dockerfile .
  4. # 启动测试
  5. $ docker run -d -p 10012:22 sshd:dockerfile
  6. $ ssh 172.18.83.251 -p 10012

Docker 安装 Nginx

  1. # 查询
  2. $ docker search nginx
  3. # 拉取官方镜像
  4. $ docker pull nginx
  5. # 使用nginx镜像 运行容器
  6. $ docker run -p 80:80 --name mynginx -v $PWD/www:/www -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf -v $PWD/logs:/wwwlogs -d nginx
  7. # 启动参数说明
  8. -p 80:80:将容器的80端口映射到主机的80端口
  9. --name mynginx:将容器命名为mynginx
  10. -v $PWD/www:/www:将主机中当前目录下的www挂载到容器的/www
  11. -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf:将主机中当前目录下的nginx.conf挂载到容器的/etc/nginx/nginx.conf
  12. -v $PWD/logs:/wwwlogs:将主机中当前目录下的logs挂载到容器的/wwwlogs

Docker 安装 Tomcat

  1. $ docker pull tomcat
  2. # 拉取最新版本
  3. $ docker pull tomcat
  4. # 使用镜像运行容器
  5. $ docker run --name tomcat -p 8080:8080 -v $PWD/test:/usr/local/tomcat/webapps/test -d tomcat
  6. # 启动参数说明
  7. -p 8080:8080:将容器的8080端口映射到主机的8080端口
  8. -v $PWD/test:/usr/local/tomcat/webapps/test:将主机中当前目录下的test挂载到容器的/test

使用docker安装ElasticSearch

  1. # 使用docker安装ElasticSearch
  2. #搜索镜像
  3. [root@izadux3fzjykx7z ~]$ docker search elasticsearch
  4. #拉取镜像
  5. [root@izadux3fzjykx7z ~]$ docker pull elasticsearch:6.5.0
  6. #启动一个ElasticSearch容器
  7. [root@izadux3fzjykx7z ~] $ docker run --name elasticsearch -d -e ES_JAVA_OPTS="-Xms214m -Xmx214m" -p 9200:9200 -p 9300:9300 elasticsearch:6.5.0

Docker 安装 MySQL

  1. $ docker search mysql
  2. $ docker pull mysql:5.6
  3. $ docker run -p 3306:3306 --name mymysql -v $PWD/conf:/etc/mysql/conf.d -v $PWD/logs:/logs -v $PWD/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6
  4. # 启动参数说明
  5. -p 3306:3306:将容器的 3306 端口映射到主机的 3306 端口。
  6. -v -v $PWD/conf:/etc/mysql/conf.d:将主机当前目录下的 conf/my.cnf 挂载到容器的 /etc/mysql/my.cnf
  7. -v $PWD/logs:/logs:将主机当前目录下的 logs 目录挂载到容器的 /logs
  8. -v $PWD/data:/var/lib/mysql :将主机当前目录下的data目录挂载到容器的 /var/lib/mysql
  9. -e MYSQL_ROOT_PASSWORD=123456:初始化 root 用户的密码。

Docker 安装 Redis

  1. $ docker search redis
  2. $ docker pull redis:3.2
  3. $ docker run -p 6379:6379 -v $PWD/data:/data -d redis:3.2 redis-server --appendonly yes
  4. # 参数说明
  5. -p 6379:6379 : 将容器的6379端口映射到主机的6379端口
  6. -v $PWD/data:/data : 将主机中当前目录下的data挂载到容器的/data
  7. redis-server --appendonly yes : 在容器执行redis-server启动命令,并打开redis持久化配置
  8. # 进入redis命令行
  9. $ docker exec -it 容器id redis-cli

Docker三剑客一之 Compose

  • Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排

Compose 中有两个重要的概念:

  • 服务 (service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
  • 项目 (project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。

安装与卸载

  • Compose 支持 Linux、macOS、Windows 10 三大平台
  • Compose 可以通过 Python 的包管理工具 pip 进行安装,也可以直接下载编译好的二进制文件使用,甚至能够直接在 Docker 容器中运行。
  1. # 二进制安装
  2. $ sudo curl -L https://github.com/docker/compose/releases/download/1.17.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
  3. $ sudo chmod +x /usr/local/bin/docker-compose
  4. # 卸载命令
  5. $ sudo rm /usr/local/bin/docker-compose
  6. # 容器中执行
  7. $ curl -L https://github.com/docker/compose/releases/download/1.8.0/run.sh > /usr/local/bin/docker-compose
  8. $ chmod +x /usr/local/bin/docker-compose
  9. [root@izadux3fzjykx7z bin]# docker-compose --version
  10. docker-compose version 1.8.0, build f3628c7

常用命令

  1. build
  2. 格式为 docker-compose build [options] [SERVICE...]。
  3. --force-rm 删除构建过程中的临时容器。
  4. --no-cache 构建镜像过程中不使用 cache(这将加长构建过程)。
  5. --pull 始终尝试通过 pull 来获取更新版本的镜像。
  6. config:验证 Compose 文件格式是否正确,若正确则显示配置,若格式错误显示错误原因。
  7. down:此命令将会停止 up 命令所启动的容器,并移除网络
  8. exec :进入指定的容器
  9. images :列出 Compose 文件中包含的镜像
  10. help:获得一个命令的帮助
  11. images:列出 Compose 文件中包含的镜像
  12. kill:通过发送 SIGKILL 信号来强制停止服务容器
  13. logs: 查看服务容器的输出
  14. pause: 暂停一个服务容器。
  15. port:打印某个容器端口所映射的公共端口。
  16. ps:列出项目中目前的所有容器。
  17. pull:拉取服务依赖的镜像
  18. push:推送服务依赖的镜像到 Docker 镜像仓库
  19. restart: 重启项目中的服务。
  20. rm:删除所有(停止状态的)服务容器。推荐先执行 docker-compose stop 命令来停止容器
  21. run: 在指定服务上执行一个命令。
  22. scale: 设置指定服务运行的容器个数 docker-compose scale web=3 db=2 将启动 3 个容器运行 web 服务,2 个容器运行 db 服务。
  23. start:启动已经存在的服务容器
  24. stop:停止已经处于运行状态的容器
  25. top:查看各个服务容器内运行的进程。
  26. unpause:恢复处于暂停状态中的服务。
  27. up:它将尝试自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作。如果使用 docker-compose up -d,将会在后台启动并运行所有的容器。一般推荐生产环境下使用该选项
  28. version:打印版本信息。

Compose 模板文件

参考

  • Docker安装手册:https://docs.docker-cn.com/engine/installation/
  • 菜鸟教程:http://www.runoob.com/docker/centos-docker-install.html
  • Docker技术入门与实战

Docker 笔记学习的更多相关文章

  1. Docker笔记(二):Docker管理的对象

    原文地址:http://blog.jboost.cn/2019/07/14/docker-2.html 在Docker笔记(一):什么是Docker中,我们提到了Docker管理的对象包含镜像.容器. ...

  2. 在Windows环境中开始Docker的学习和体验

    研究docker有一段时间了,当然我主要的使用环境还是在Linux中,确实很方便. 但也有不少朋友希望使用Windows来工作学习,这里介绍一下在Windows中如何快速开始Docker的学习和体验吧 ...

  3. Docker容器学习梳理 - 应用程序容器环境部署

    关于国内Docker镜像,可以参考:Docker容器学习梳理--基础知识(2) 的Docker镜像使用. 如果我们需要在Docker环境下部署tomcat.redis.mysql.nginx.php等 ...

  4. Docker容器学习梳理 - 日常操作总结

    使用Docker已有一段时间了,今天正好有空梳理下自己平时操作Docker时的一些命令和注意细节: Docker 命令帮助 $ sudo docker Commands: attach Attach ...

  5. Docker笔记(四):Docker镜像管理

    原文地址:http://blog.jboost.cn/2019/07/16/docker-4.html 在Docker中,应用是通过容器来运行的,而容器的运行是基于镜像的,类似面向对象设计中类与对象的 ...

  6. Docker笔记(七):常用服务安装——Nginx、MySql、Redis

    开发中经常需要安装一些常用的服务软件,如Nginx.MySql.Redis等,如果按照普通的安装方法,一般都相对比较繁琐 —— 要经过下载软件或源码包,编译安装,配置,启动等步骤,使用 Docker ...

  7. Docker笔记(八):数据管理

    前面(哪个前面我也忘了)有说过,如果我们需要对数据进行持久化保存,不应使其存储在容器中,因为容器中的数据会随着容器的删除而丢失,而因通过将数据存储于宿主机文件系统的形式来持久化.在Docker容器中管 ...

  8. Docker笔记(九):网络管理

    Docker的应用运行在容器中,其相互之间或与外部之间是如何通信的,涉及到哪些知识点,本文对相关内容进行整理.因网络这块牵涉的面较多,因此只从日常使用或理解的角度出发,过于专业的就不深入探讨了. 1. ...

  9. Docker笔记(十一):Dockerfile详解与最佳实践

    Dockerfile是一个文本文件,包含了一条条指令,每条指令对应构建一层镜像,Docker基于它来构建一个完整镜像.本文介绍Dockerfile的常用指令及相应的最佳实践建议. 1. 理解构建上下文 ...

随机推荐

  1. 利用perspective 和 transform 里面的几个参数来实现旋转照片墙

    旋转照片墙 首先,来看下,是什么效果吧,上效果图 ↓ 其实这个东西,很容易制作,先说下思路, 把照片都给叠在一起,然后 rotateY 旋转,给每张图片 旋转不一样的角度能构成一圈, 然后transl ...

  2. java工作两年了,连myBatis中的插件机制都玩不懂,那你工作危险了!

    插件的配置与使用 在mybatis-config.xml配置文件中配置plugin结点,比如配置一个自定义的日志插件LogInterceptor和一个开源的分页插件PageInterceptor: & ...

  3. Java基础教程——Socket编程

    Socket通常也称作"套接字",用于描述IP地址和端口,可以用来实现不同虚拟机或不同计算机之间的通信. --百度百科 套接字允许应用程序插入到网络中,并与插入到网络中的其他应用程 ...

  4. mysql 数据文件

    mysql8.0取消了frm文件 . ibd数据和索引

  5. @Async失效之谜

    @Async如何使用 异步的方法上加上@Async异步注解 启动类中需要加上@EnableAsync才有效 使用时类似于下列函数: new Thread(()-> System.out.prin ...

  6. Window .NetCore Nginx

    1.首先去官网下载Nginx 官网地址:http://nginx.org/en/download.html 2.下载好之后,我的文件是放在D:\InstallFiles\Nginx\nginx-1.1 ...

  7. 这次我让你彻底弄懂 RESTful

    微信搜 「yes的练级攻略」干货满满,不然来掐我,回复[123]一份20W字的算法刷题笔记等你来领.欢迎分享,转载请保留出处. 本文已收录至 https://github.com/yessimida/ ...

  8. CSP2020复赛游记

    CSP2020复赛游记 由于本蒟蒻侥幸通过PJ和TG的分数线并且侥幸的拿了一等,所以侥幸的来参加复赛 11.04~11.05 期中考,挂 11.06 对答案,炸 11.07 开始了第一次CSP复赛 坐 ...

  9. python MD5加密和flask-generate_password_hash

    实际开发过程中,有些数据是需要加密保存或者处理的,为了就是为了保证源数据的安全性.那么MD5加密作为一种简单有效的非对称加密方式在日常开发过程中也经常的被使用到.下面就来介绍下MD5算法: 1.  * ...

  10. 第三十五章、PyQt输入部件:QFontComboBox、QLineEdit、QTextEdit、QPlainText功能详解

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 一.引言 输入部件量比较多,且功能很丰富,但除了用于编写编辑器.浏览器 ...