Docker入门

Docker常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
---------------------搜索下载-------------------------
docker search 镜像名称 //搜索镜像
docker pull 镜像名称:版本号 //拉取对应版本的镜像
docker pull 镜像名称 //默认拉取最新的镜像

---------------------查看-------------------------
docker images //查看本地已下载的镜像
docker ps //查看正在运行的容器
docker ps -a //查看所有的容器(包括run、stop、exited状态的)
docker container ls //查看正在运行的容器

---------------------删除-------------------------
docker rm 容器ID //只能删除没有在运行的容器
docker rm -f 容器ID //可以删除正在运行的容器
docker rmi 镜像名称/ID //删除镜像

---------------------删除含有正在运行容器的镜像-------------------------
docker ps //找到运行的容器id
docker stop 容器id //不停止就删除镜像,会报错:Error response from daemon: conflict: unable to delete db1d293f9183 (must be forced) - image is being used by stopped container 19872298946a
docker rm 容器ID //可以删除正在运行的容器
docker images //查看镜像id
docker rmi 镜像名称/ID //删除镜像

---------------------基本-------------------------
docker run -p 本地主机端口号:容器服务端口号 --name 容器名字 [-e 配置信息修改] -d 镜像名字
docker start 容器ID //启动容器
docker stop 容器ID //终止容器

---------------------日志-------------------------
docker log 容器id/容器名

---------------------linux查看进程--------------------------
ps -ef | grep 名称(如:tomcat)

Docker配置阿里云镜像加速器

docker本身的仓库非常慢,但是国内有阿里云的镜像仓库非常快。下面我以阿里云镜像加速器为例配置。注意:针对Docker客户端版本大于 1.10.0 的用户

1、注册阿里云,进入官网,找到 容器镜像服务 中的 镜像加速器

2、找到daemon.json文件,并编辑

1
vim  /etc/docker/daemon.json

3、添加加速器配置,然后保存文件

1
2
3
{
"registry-mirrors": ["加速地址"]
}

4、重启docker服务

1
2
3
sudo systemctl daemon-reload  

sudo systemctl restart docker

然后下载的时候速度就快多了。

引自-CSDN博主:JAVA码上飘

Docker安装MySQL数据库

环境:Centos 8, Docker1.13.1

1、docker仓库搜索mysql

1
docker search mysql

2、docker仓库拉取mysql

1
2
docker pull mysql // 默认拉取最新版本的
docker pull mysql:8.0 // 拉取指定版本的

3、查看本地镜像是否下载成功

1
docker images mysql:8.0

1
docker images // 查看镜像

4、安装运行mysql8.0容器

1
2
3
4
5
6
7
docker run -p 3307:3306 --name mysql8.0 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0
----------------------------------

-p 将本地主机的端口映射到docker容器端口(默认端口3306,因为本机的3306端口已被其它版本占用,所以使用3307
--name 容器名称命名
-e 配置信息,配置root密码
-d mysql8.0后台启动


看到如下界面,就表示mysql启动成功啦。

5、查看mysql8.0容器运行情况

1
docker ps

6、docker登录mysql

1
2
docker exec -it mysql8.0 bash
mysql -uroot -p

如图所示,则表示我们已经 成功连上mysql了。

注意: 如果登录出现以下错误,先确认自己密码是否错误,如果确认无误后。就要检查mysql启动的时候是不是少了什么参数,因为也会导致连接失败。比如:docker run –name mysql8 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0 这种都是有问题的

7、使用客户端连接工具(Navicat)远程登录mysql

然后就大功告成了。

Docker安装Tomcat

1、启动Tomcat容器

1
2
3
4
5
6
7
// 根据镜像版本启动容器
docker run --name mytomcat -d tomcat:latest
// 启动一个做了端口号映射的tomcat
docker run -d -p 8181:8080 tomcat
---------------------------------------
-d:后台运行
-p:将主机的端口映射到容器的一个端口,即 主机端口:容器内部的端口

2、查看已经启动的容器:docker ps

3、使用8181端口访问Tomcat,记得 先把8181端口放行

4、访问失败,页面显示 源服务器未能找到目标资源的表示或者是不愿公开一个已经存在

5、先查看防火墙状况

1
service firewalld status

出现下图所示代码,表示已经关闭防火墙

如果防火墙没关闭,先关闭防火墙

1
2
3
4
5
6
7
8
# 关闭防火墙
systemctl stop firewalld.service // 也可service firewalld stop
# 禁止防火墙开机启动
systemctl disable firewalld.service
# 启动docker
systemctl start docker
# 重启docker
systemctl restart docker

6、如果防火墙已经关闭但访问tomcat还是失败,那么使用如下命名进入tomcat的目录

1
docker exec -it a5f02a3e6dde(启动的tomcat容器的容器id) /bin/bash

7、查看当前文件夹内的所有文件

1
ls

8、进入webapps文件夹下,如果显示total 0,我们就需要把webapps.dist中的内容复制到webapps文件夹下

1
2
3
cd webapps
rm -rf webapps
cp -r webapps.dist webapps

8、进入webapps文件夹下,如果显示total 0,我们就需要把webapps.dist中的内容复制到webapps文件夹下

1
2
3
cd webapps
rm -f webapps
cp -r webapps.dist webapps

9、然后查看是否有可运行的容器:docker ps ,如果tomcat在运行即可正常访问了。

感谢CSDN博主-shawn_zhouii

Docker安装RabbitMQ

RabbitMQ安装和基本配置

1、安装RabbitMQ服务

1
docker pull rabbitmq:3-management //注意docker pull rabbitmq如果安装这个是后面不能访问管理网页的

2、查看安装的RabbitMQ的镜像id

1
docker images

3、启动RabbitMQ

1
docker run -d -p 5672:5672 -p 15672:15672 --name myrabbitmq 镜像id

4、访问RabbitMQ管理平台

1
2
通过:[服务器ip:15672访问]
默认账号密码为:guest

5、添加队列queues

目前只需要用到blue,blue.emps,blue.news,coderblue.news

6、添加Exchanges交换机,并绑定队列

  • exchange.direct:类型 direct

  • exchange.topic:类型 topic

  • exchange.fanout:类型 fanout

注意:

  • Exchange一共有四种类型:direct、topic、headers 和fanout

  • 效率:fanout > direct > topic

  • Direct Exchange:将消息中的Routing key与该Exchange关联的所有Binding中的Routing key进行比较,如果相等,则发送到该Binding对应的Queue中。(全路径匹配)

  • Topic Exchange:将消息中的Routing key与该Exchange关联的所有Binding中的Routing key进行对比,如果匹配上了,则发送到该Binding对应的Queue中。(与关联的对比匹配,可模糊匹配)。匹配规则如下:

    • *:匹配一个单词
    • #:匹配0个或多个字符
    • *,#:只能写在.号左右,且不能挨着字符
    • 单词和单词之间需要用.隔开
  • Fanout Exchange:直接将消息转发到所有binding的对应queue中,这种exchange在路由转发的时候,忽略Routing key。(广播到所有)

  • Headers Exchange:将消息中的headers与该Exchange相关联的所有Binging中的参数进行匹配,如果匹配上了,则发送到该Binding对应的Queue中。

感谢:CSDN博主-做个好人好吗

RabbitMQ使用

下面以Springboot工程(版本2.3.3.RELEASE)为例,操作rabbitmq

1、配置properties

1
2
3
4
spring.rabbitmq.host=服务器ip
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
#spring.rabbitmq.port=5672

2、添加MQConfig配置文件,更改默认的序列化规则

1
2
3
4
5
6
7
8
@Configuration
public class MQConfig {

@Bean
public MessageConverter messageConverter() {
return new Jackson2JsonMessageConverter();
}
}

3、创建UserInfo实体类

1
2
3
4
5
6
7
8
9
10
/**
* 无参、有参构造都要、toString、set、get
*/
@Data
public class UserInfo {

private String userName;

private Integer age;
}

4、使用Junit5测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
@SpringBootTest
class RabbitmqApplicationTests {

@Autowired
RabbitTemplate rabbitTemplate;

@Autowired
AmqpAdmin amqpAdmin;

/**
* 单播:点对点发送map格式
*/
@Test
void contextLoads() {
// Message需要自己构造一个;定义消息体内容和消息头
// rabbitTemplate.send(exchage, routeKey, message);

// object默认当成消息体,只需传入要发送的对象,自动序列化发送给rabbitmq;
// rabbitTemplate.converAndSend(exchage,routeKey,object)
HashMap<String, Object> map = new HashMap<>();
map.put("msg", "这是converAndSend发送的消息");
map.put("data", Arrays.asList(2, "helloWorld", false));
// 默认使用java的序列化消息:application/x-java-serialized-object
rabbitTemplate.convertAndSend("exchange.direct", "blue.news", map);
}

/**
* 单播:点对点发送对象格式
*/
@Test
void contextLoadsObject() {
rabbitTemplate.convertAndSend("exchange.direct", "blue.users", new UserInfo("Kity", 20));
}

/**
* 广播
*/
@Test
void sendMsg() {
rabbitTemplate.convertAndSend("exchanges.fanout", "", new UserInfo("fanout", 20));
}

@Test
public void createExchange() {
// 创建交换器
amqpAdmin.declareExchange(new DirectExchange("amqpadmin.exchange"));
System.out.println("创建完成");
// 创建队列
amqpAdmin.declareQueue(new Queue("amqpadmin.queue", true));
// 创建绑定规则
amqpAdmin.declareBinding(new Binding("amqpadmin.queue", Binding.DestinationType.QUEUE,
"amqpadmin.exchange", "创建绑定规则", null));
}

/**
* 删除
*/
@Test
public void deleteQueue() {
// 删除队列
amqpAdmin.deleteQueue("amqpadmin.queue");
// 删除交换机
amqpAdmin.deleteExchange("blue.users");
}

/**
* 接收数据: 接收一个队列里就少一个
*/
@Test
public void receive() {
// 注意有参无参构造器都要
Object o = rabbitTemplate.receiveAndConvert("blue.users");
System.out.println(o.getClass());
System.err.println(o);
}
}

5、监听接收对应匹配队列的消息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
* 记得在启动类添加:@EnableRabbit,使用Rabbit注解
*/
@Service
public class UserInfoService {

@RabbitListener(queues = "blue.users",containerFactory = "rabbitListenerContainerFactory")
public void receive(UserInfo userInfo) {
System.out.println("接收到的userInfo:" + userInfo);
}

@RabbitListener(queues = "blue")
public void receiveMsg(Message message) {
System.out.println(Arrays.toString(message.getBody()));
System.out.println(message.getMessageProperties());
}

}

Docker安装Elasticsearch

1、下载ES

1
docker pull elasticsearch

2、运行ES

1
2
// ES默认设置jvm最少需要1GB的堆内存
docker run -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -d p 9300:9300 --name ES 镜像id

注意:如果服务器内存不够,即便启动了,ES被访问的时候也很有可能宕机!

Docker安装zookeeper

1、下载zookeeper

1
docker pull zookeeper

2、启动zk

1
docker run --name zk -p 2181:2181 --restart always -d 镜像id

Docker命令集

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
Management Commands:
container Manage containers
image Manage images
network Manage networks
node Manage Swarm nodes
plugin Manage plugins
secret Manage Docker secrets
service Manage services
stack Manage Docker stacks
swarm Manage Swarm
system Manage Docker
volume Manage volumes

Commands:
attach Attach to a running container
build Build an image from a Dockerfile
commit Create a new image from a container's changes
cp Copy files/folders between a container and the local filesystem
create Create a new container
diff Inspect changes on a container's filesystem
events Get real time events from the server
exec Run a command in a running container
export Export a container's filesystem as a tar archive
history Show the history of an image
images List images
import Import the contents from a tarball to create a filesystem image
info Display system-wide information
inspect Return low-level information on Docker objects
kill Kill one or more running containers
load Load an image from a tar archive or STDIN
login Log in to a Docker registry
logout Log out from a Docker registry
logs Fetch the logs of a container
pause Pause all processes within one or more containers
port List port mappings or a specific mapping for the container
ps List containers
pull Pull an image or a repository from a registry
push Push an image or a repository to a registry
rename Rename a container
restart Restart one or more containers
rm Remove one or more containers
rmi Remove one or more images
run Run a command in a new container
save Save one or more images to a tar archive (streamed to STDOUT by default)
search Search the Docker Hub for images
start Start one or more stopped containers
stats Display a live stream of container(s) resource usage statistics
stop Stop one or more running containers
tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
top Display the running processes of a container
unpause Unpause all processes within one or more containers
update Update configuration of one or more containers
version Show the Docker version information
wait Block until one or more containers stop, then print their exit codes

常见问题:

1、docker-Error: No such container,附docker常用命令

打算删除掉docker镜像但是发现有几个镜像就是删除不了,加了-f强制删除也不行,一直报Error: No such container的错误,最后终于找到了办法直接删除文件,步骤如下:

root用户:查看所有容器

1
2
3
docker ps

docker stop 查出来的容器id

如果这样还不行的话就尝试下如下操作。进入 /var/lib/docker/containers 文件下

1
cd /var/lib/docker/containers

如图

回到docker目录下,删除containers文件下的容器

1
rm -rf containers


不能删除的就是正在运行的,要先停止。

如图,我们可以看到有两个停止的容器被删除了。

2、解决删除镜像时image is referenced in multiple repositories

解决:查看镜像,仔细观察,发现0d64f46acfd1这个镜像id指向了两个repository,因此无法删除

故删除时可以用repository和tag的方式来删除

1
docker rmi 仓库:tag名

重新查看就发现最新版本的mysql已经被删除了

参考-思否博主:张德Talk
参考-博客园:_你的眉宇

SVN错误集

svn: E155015: 提交失败(细节如下)

svn 出现冲突是经常发生的事,最近改用命令操作svn,用界面电脑有些反应慢

出现冲突使用svn 命令肯定也是可以解决的:

查看警告信息提示冲突的文件,执行

svn resolved <文件名>

或者

找到本地项目位置,右键选择SVN,点击 Resolve

svn: Previous operation has not finished; run ‘cleanup’ if it was interrupted

1
cmd切换到工作目录下,直接输入svn cleanup解决
  1. © 2020 Liu Yang    湘ICP备20003709号

请我喝杯咖啡吧~

支付宝
微信