docker(2)

Docker(2)

以ubuntu容器为例,在宿主机和容器之间添加数据卷。添加数据卷的命令 是

docker run -it –privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名

1
2
[root@shjava101 ~]# docker run -it --privileged=true -v 
/tmp/hostData:/tmp/dockerData1 ubuntu /bin/bash
  • 查看宿主机目录 查看宿主机目录 在宿主机对应的目录里面创建一个文件 回到容器目录查看 我们发现在容器中,这个文件也会存在。
  • 要宿主机和容器之间的目录形成挂载关系,不管是容器内数据发生变化, 还是宿主机内部数据发生变化,都会被另一方即时同步
  • 容器停止了,当再次启动容器之后,文件依然还是可以同步

如何查看数据卷挂载成功

docker inspect 容器id

1
[root@shjava101 ~]# docker inspect 1c88215ff319

image-20240719191315528

上面的挂载,默认在容器内部的目录都可以进行读写操作。如果我们只想在容 器内部进行读操作呢? 我们需要加上:ro标识 (read only)

1
2
3
4
5
6
[root@shjava101 ~]# docker run -it --privileged=true -v 
/tmp/hostData:/tmp/dockerData1:ro ubuntu /bin/bash

root@f4bce15fcc4e:/# cd /tmp/dockerData1/
root@f4bce15fcc4e:/tmp/dockerData1# touch d.txt # 创建文件失败
touch: cannot touch 'd.txt': Read-only file system

如果宿主机写入内容,可以同步给容器内,容器可以读取到。 容器的数据卷还可以被继承和共享。

docker run -it –privileged=true –volumes-from 父类 –name u2 ubuntu

1
2
3
4
 [root@shjava101 hostData]# docker run -it  --privileged=true --
volumes-from u1 --name=u2 ubuntu /bin/bash
root@1e8776ef5733:/# cd /tmp/data/
root@1e8776ef5733:/tmp/data#

Docker 安装常规软件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@shjava101 ~]# docker search tomcat/
[root@shjava101 ~]# docker pull tomcat
[root@shjava101 ~]# docker run -d -p 8080:8080 --name t1 tomcat
[root@shjava101 ~]# docker ps
CONTAINER ID IMAGE
COMMAND
STATUS
7dd763fc2bcd
PORTS
tomcat
CREATED
NAMES
"catalina.sh run" 4 seconds ago Up 3
seconds 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp t1

tomcat10 以上 webapps 目录存在问题 改为了webapps.list

1
2
3
4
5
6
7
8
9
10
root@7dd763fc2bcd:/usr/local/tomcat# cd webapps.dist/
root@7dd763fc2bcd:/usr/local/tomcat/webapps.dist# ls -l
total 4
drwxr-xr-x. 3 root root 223 Dec 22 2021 ROOT
drwxr-xr-x. 15 root root 4096 Dec 22 2021 docs
drwxr-xr-x. 7 root root 99 Dec 22 2021 examples
drwxr-xr-x. 6 root root 79 Dec 22 2021 host-manager
drwxr-xr-x. 6 root root 114 Dec 22 2021 manager
root@7dd763fc2bcd:/usr/local/tomcat# rm -rf webapps
root@7dd763fc2bcd:/usr/local/tomcat# mv webapps.dist/ webapps

Mysql 实现容器挂载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
root@shjava101 /]# docker run -d -p 3307:3306 --privileged=true -v /opt/mysql/log:/var/log/mysql -v 
/opt/mysql/data:/var/lib/mysql -v
/opt/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:5.7

新建my.cnf
[root@shjava101 /]# cd /opt/mysql/conf/
[root@shjava101 conf]# vim my.cnf

[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8

[root@shjava101 conf]# docker exec -it 0a992c086f8e /bin/bash
root@0a992c086f8e:/# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2

实现数据卷挂载,将mysql相关的运行数据同步到宿主机的指定目录。

Redis + Docker

  • 创建目录
1
2
[root@shjava101 /]# cd /opt
[root@shjava101 /]# mkdir -p app/redis
  • 将一个redis.conf文件模板拷贝进/opt/app/redis目录下
1
2
3
4
[root@shjava101 opt]# cp redis.conf /opt/app/redis/
[root@shjava101 opt]# cd /opt/app/redis
[root@shjava101 redis]# ll
total 92-rw-r--r--. 1 root root 92242 Dec 29 21:33 redis.conf
  • /opt/app/redis目录下修改redis.conf文件
  1. 允许redis外部连接

image-20240719192039910

  1. daemonize no

将daemonize yes注释起来或者 daemonize no设置,因为该配置和docker run中-d 参数冲突,会导致容器一直启动失败

  1. 开启redis数据持久化 appendonly yes
  2. 使用redis6.0.8镜像创建容器(也叫运行镜像)