1.docker镜像相关命令
搜索镜像
可使用 docker search命令搜索存放在 Docker Hub中的镜像。执行该命令后, Docker就会在Docker Hub中搜索含有 java这个关键词的镜像仓库。
docker search java
以上列表包含五列,含义如下:
NAME:镜像仓库名称。
DESCRIPTION:镜像仓库描述。
STARS:镜像仓库收藏数,表示该镜像仓库的受欢迎程度,类似于 GitHub的 stars0
OFFICAL:表示是否为官方仓库,该列标记为[0K]的镜像均由各软件的官方项目组创建和维护。
AUTOMATED:表示是否是自动构建的镜像仓库。
下载镜像
使用命令docker pull命令即可从 Docker Registry上下载镜像,执行该命令后,Docker会从 Docker Hub中的 java仓库下载最新版本的 Java镜像。如果要下载指定版本则在java后面加冒号指定版本,例如:docker pull java
docker pull java
列出镜像
使用 docker images命令即可列出已下载的镜像
docker images
以上列表含义如下
- REPOSITORY:镜像所属仓库名称。
- TAG:镜像标签。默认是 latest,表示最新。
- IMAGE ID:镜像 ID,表示镜像唯一标识。
- CREATED:镜像创建时间。
- SIZE: 镜像大小。
删除本地镜像
使用 docker rmi命令即可删除指定镜像
docker rmi java
容器相关命令
新建并启动容器
使用以下docker run命令即可新建并启动一个容器,该命令是最常用的命令,它有很多选项,下面将列举一些常用的选项。
-d选项:表示后台运行
-P选项:随机端口映射
-p选项:指定端口映射,有以下四种格式。
-- ip:hostPort:containerPort
-- ip::containerPort
-- hostPort:containerPort
-- containerPort
--net选项:指定网络模式,该选项有以下可选参数:
--net=bridge:默认选项,表示连接到默认的网桥。
--net=host:容器使用宿主机的网络。
--net=container:NAME-or-ID:告诉 Docker让新建的容器使用已有容器的网络配置。
--net=none:不配置该容器的网络,用户可自定义网络配置。
docker run -d -p 90:80 nginx
这样就能启动一个 Nginx容器。在本例中,为 docker run添加了两个参数,含义如下:
-d 后台运行
-p 宿主机端口:容器端口 #开放容器端口到宿主机端口
访问 http://Docker宿主机 IP:90/,将会看到nginx的主界面如下:
需要注意的是,使用 docker run命令创建容器时,会先检查本地是否存在指定镜像。如果本地不存在该名称的镜像, Docker就会自动从 Docker Hub下载镜像并启动一个 Docker容器。
列出容器
用 docker ps命令即可列出运行中的容器
docker ps
如需列出所有容器(包括已停止的容器),可使用-a参数。该列表包含了7列,含义如下
- CONTAINER_ID:表示容器 ID。
- IMAGE:表示镜像名称。
- COMMAND:表示启动容器时运行的命令。
- CREATED:表示容器的创建时间。
- STATUS:表示容器运行的状态。UP表示运行中, Exited表示已停止。
- PORTS:表示容器对外的端口号。
- NAMES:表示容器名称。该名称默认由 Docker自动生成,也可使用 docker run命令的--name选项自行指定。
停止容器
使用 docker stop命令,即可停止容器
docker stop 90b37bd22fec
其中90b37bd22fec是容器 ID,当然也可使用 docker stop容器名称来停止指定容器
强制停止容器
可使用 docker kill命令发送 SIGKILL信号来强制停止容器
docker kill 90b37bd22fec
启动已停止的容器
使用docker run命令,即可新建并启动一个容器。对于已停止的容器,可使用 docker start命令来启动
docker start 90b37bd22fec
查看容器所有信息
docker inspect 90b37bd22fec
查看容器日志
docker container logs 90b37bd22fec
查看容器里的进程
docker rm 90b37bd22fec
进入容器
使用docker container exec命令用于进入一个正在运行的docker容器。如果docker run命令运行容器的时候,没有使用-it参数,就要用这个命令进入容器。一旦进入了容器,就可以在容器的 Shell 执行命令了
docker rm 90b37bd22fec
删除容器
使用 docker rm命令即可删除指定容器
docker rm 90b37bd22fec
参看ip
docker inspect mycentos3
ip地址位于NetworkSettings 下的IpAddress
2.应用部署
2.1 MySQL部署
(1)拉取mysql镜像
docker pull centos/mysql-57-centos7
(2)创建容器
docker run -di --name=tensquare_mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql
-p代表端口映射,格式为 宿主机映射端口:容器运行端口
-e 代表添加环境变量 MYSQL_ROOT_PASSWORD 是root用户的登录密码
(3)进入mysql容器
docker exec -it tensquare_mysql /bin/bash
(4)登录mysql
mysql -u root -p
2.2 tomcat部署
(1)拉取镜像
docker pull tomcat:7-jre7
(2)创建容器
创建容器 -p表示地址映射
docker run -di --name=mytomcat -p 9000:8080 -v /usr/local/webapps:/usr/local/tomcat/webapps tomcat:7-jre7
2.3 Nginx部署
(1)拉取镜像
docker pull nginx
(2)创建Nginx容器
docker run -di --name=mynginx -p 80:80 nginx
2.4 Redis部署
(1)拉取镜像
docker pull redis
(2)创建容器
1.不设置密码:docker run -di --name=redis -p 6379:6379 redis
2.设置密码 :docker run -di --name=redis -p 6379:6379 redis --requirepass "123456"
--name=redis 是你给redis起的别名
redis启动的默认端口号是6379,这个时候宿主机使用6379进行映射,并设置授权密码123456
(3)启动redis
docker exec -it redis redis-cli
2.5 RabbitMQ
一、docker上部署启动RabbitMQ
(1)查询rabbitmq镜像
$ docker search rabbitmq:management ( 查询 management 版本的 rabbitmq ) 此版本有 管理界面
(2)拉取rabbitmq镜像
$ docker pull rabbitmq:management ( 拉取 management 版本的 rabbitmq )拉取最好指定版本 不然会拉取 latest 版本
(3)创建并启动容器
3.1创建和启动(不设置密码)
docker run -d -p 5672:5672 -p 15672:15672 --name rabbitmq rabbitmq:management
其中:
--hostname:指定容器主机名称 --name:指定容器名称 -p:将mq端口号映射到本地
3.2备选启动同时设置用户和密码
docker run -d --hostname my-rabbit --name rabbit -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -p 15672:15672 -p 5672:5672 -p 25672:25672 -p 61613:61613 -p 1883:1883 rabbitmq:management
注意:
15672:控制台端口号
5672:应用访问端口号
此处的端口访问是有区别的,控制台端口用于管理rabbitmq,应用访问端口号为rabbitclient等应用访问。
3.3查看rabbitmq运行状况:
docker logs rabbit
3.4 访问
http://localhost:15672
3.5 登录
默认账户名:guest
密码:guest
提醒,如果关闭计算机时未停止这个启动的容器,再次启动docker时会出现无法访问15672的情况,此时只需停止并移除这个容器,然后重启一次docker,重新执行启动rabbitmq容器的命令即可。
二、使用RabbitMQ
1、创建sender
a、构建消息提供者类sender
package org.vertx.vertx.rabbitmq.example; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; import java.io.IOException; import java.util.concurrent.TimeoutException; public class Send { private final static String QUEUE_NAME = "hello"; public static void main(String[] argv)throws java.io.IOException, TimeoutException { ConnectionFactory factory = new ConnectionFactory(); factory.setUsername("guest"); factory.setPassword("guest"); factory.setHost("localhost"); factory.setPort(5672); factory.setVirtualHost("/"); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); channel.queueDeclare(QUEUE_NAME, false, false, false, null); String message = "Hello World!"; channel.basicPublish("", QUEUE_NAME, null, message.getBytes()); System.out.println(" [x] Sent '" + message + "'"); channel.close(); connection.close(); } }
b、启动后可查看消息队列。
c、访问链接
http://127.0.0.1:15672/#/queues
可见,RabbitMQ management中name为hello的消息产生一条。
2、创建receiver
a、创建消息接收方的类receiver
package org.vertx.vertx.rabbitmq.example; import com.rabbitmq.client.*; import java.io.IOException; public class MyConsumer { private final static String QUEUE_NAME = "hello"; public static void main(String[] argv) throws Exception { ConnectionFactory factory = new ConnectionFactory(); factory.setUsername("guest"); factory.setPassword("guest"); factory.setHost("localhost"); factory.setPort(5672); factory.setVirtualHost("/"); factory.setConnectionTimeout(600000); // in milliseconds factory.setRequestedHeartbeat(60); // in seconds factory.setHandshakeTimeout(6000); // in milliseconds factory.setRequestedChannelMax(5); factory.setNetworkRecoveryInterval(500); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); channel.queueDeclare(QUEUE_NAME, false, false, false, null); System.out.println("Waiting for messages. "); Consumer consumer = new DefaultConsumer(channel) { @Override public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { String message = new String(body, "UTF-8"); System.out.println(" [x] Received '" + message + "'"); } }; channel.basicConsume(QUEUE_NAME, true, consumer); } }
b、启动receiver并访问链接
c、运行后可接收到消息
d、访问管理器查看消息队列
http://127.0.0.1:15672/#/queues
3.迁移与备份
3.1 容器保存为镜像
我们可以通过以下命令将容器保存为为镜像
docker commit -o mynginx mynginx_i
3.2 镜像备份
我们可以通过以下命令将镜像备份为tar文件
docker save -o mynginx.tar mynginx_i
3.3 镜像恢复与迁移
首先我们删除掉mynginx_img 镜像 然后执行此命令进行恢复
docker load -i mynginx.tar
-i输入的文件
执行后再次查看镜像,可以看到镜像已经恢复
4.Dockerfile
4.1 什么是dockerfile
Deckerfile 是有一系列命令和参数构成的脚本,这些命令应用于基础镜像并且最终创建一个新的镜像。
4.2 常用命令
FROM image_name:tag //定义你使用哪个基础镜像启动构建流程 MAINTAINER user_name //声明镜像的创建者 ENV key value //设置环境变量(可以写多条) RUN command //是Docker的核心部分(可以写多条) ADD source_dir/file dest_dir/file //将宿主机的文件复制到容器内,如果是一个压缩文件,将会复制后自动压缩 COPY source_dir/file dest_dir/file //和ADD相似,但是如果有压缩文件并不能解压 WORKDIR path_dir //设置工作目录
4.3 Dockerfile 构建jdk1.8镜像
先从电脑导入到虚拟机
先创建 /usr/local/dockerjdk8 文件
1)mkdir -p /usr/local/dockerjdk8
2)cd /usr/local/dockerjdk8
3)vi Dockerfile
4)docker build -t='jdk1.8' .