目录
(1)bug:Got permission denied while trying to connect to the Docker daemon socket
在确保docker已经启动起来的前提下(参考本系列的第一篇文章,此系列在容器专栏,也可以设置docker自启动,这样比较方便),然后su切换到超级用户就好了。
查看JDK镜像
docker search java
或者
docker search jdk
一搜出来一堆。
下载jdk镜像
docker pull java
刚开始拉取失败因为,显式not found lastest,默认加载最新的版本,但我们的docker的源还是官方源,访问国外网站当然慢 ,出现各种异常也在所难免,那么我们接下来要进行换源,修改/etc/docker/daemon.json,内容修改为下:
- {
- "registry-mirrors": [
- "https://hub-mirror.c.163.com",
- "https://ustc-edu-cn.mirror.aliyuncs.com",
- "https://ghcr.io",
- "https://mirror.baidubce.com"
- ]
- }
然后重启docker
service docker restart
然后即可拉取最新版本。
查看一下现在咱们有哪些镜像
可见docker.io/java已在其中
运行jdk镜像
- docker run java java -version
- #或
- docker run -it java java -version
docker run java的意思是创建并运行Java容器,后面的java -version是在这个容器里输出jdk的版本。
如果不是使用docker,咱们原来得配置环境变量,好麻烦的,现在就方便多了。
查看tomcat镜像
docker search tomcat
下载tomcat镜像
docker pull tomcat
启动tomcat容器
docker run -d --name mytomcat -p 9090:8080 tomcat
-d代表后台守护态运行,--name是为容器起一个别名,
-p代表端口的绑定,p是port的缩写,冒号左边是宿主机的端口号,而冒号右边是容器内部的端口号,形成绑定,因为外部的浏览器无法直接访问到容器的端口号,所以需要绑定端口号,如下图外部浏览器如果想访问容器的8080端口,那么需要访问宿主机的9090端口。也即这条命令是
docker run tomcat,只不过中间加了参数。
安装成功之后最后一行返回的信息是容器id号
执行docker ps查看正在运行的容器
有一个tomcat容器是运行着的,STATUS是Up就代表正在运行。
先执行ip addr查看虚拟机ip地址,然后加上端口号访问
如上查询,应该访问192.168.191.138:9090
但是我们浏览器访问192.168.191.138:9090 却访问不到东西,这是因为docker安装的tomcat和咱们之前在windows下手动安装的那个不太一样,现在我们进入这个容器查看一下,执行如下命令进入容器
docker exec -it mytomcat /bin/bash
进入容器之后查看webapps文件夹(tomcat中与web相关的都放在里面),但是发现该文件里面没有东西,其实东西都在webapps.dist(webapps的备用文件)中,所以我们把 webapps文件夹删除,然后把webapps.dist改名为webapps即可。
重启容器
docker restart ce
咱们在上面的docker ps命令中已经可以知道已经创建的tomcat容器的id号,ce是其前两位。
然后再访问即可成功!
注意:
- -p 映射端口 宿主机端口号:容器内应用端口
- -P随机端口
停掉并删除这个正在运行的容器,注意删除容器和删除镜像不是一回事。
- docker stop ce
- docker rm ce
docker search mysql:5.7
docker pull mysql:5.7
docker run --name mysql -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
参数:
- -p 我们以后使用3307 端口来访问mysql 为了防止黑客攻击
- -e 配置环境变量:MYSQL_ROOT_PASSWORD 设置容器内mysql root 密码
接下来就可以直接进入数据库
然后也可以用外部工具,连接此数据库,比如用Navicat
新建连接,连接成功!
什么是容器数据卷
Docker中的数据可以存储在类似于虚拟机磁盘的介质中,在Docker中称为数据卷(DataVolume)
Docker容器和外部机器可以直接交换文件吗?答:不能
以上三个问题本来是不能的,但是有了数据卷技术之后,就变得都可以实现了。
容器挂载了某个数据卷后,就有了这个数据卷的数据。
一句话: 卷技术就是为了实现数据的持久化和同步操作,容器间也是数据共享。
docker run -v 宿主机目录(文件):容器内目录(文件)
-v代表配置数据卷,从命令格式中可以看到所谓的数据卷目录就是宿主机目录(即我们的虚拟机)。
注意事项
- 目录必须是绝对路径
- 如果目录不存在则会自动创建
- 可以挂载多个数据卷
咱们先查看一下webapps的目录,需要先创建并启动(run)tomcat容器,然后进入tomcat容器目录里,然后进入webapp下,输入pwd目录,获得webapp的绝对路径。
获得了我们想要的绝对路径之后我们删除该容器,重新启动一下,并挂载
然后开始启动并绑定端口号和目录路径
docker run -d --name mytomcat -p 8080:8080 -v /opt/webapps:/usr/local/tomcat/webapps tomcat
可以看到咱们指定的宿主机路径下的webapps啥也没有,因为本来不存在这个文件,执行启动命令的时候没有就给自动创建了,所以这里面ls之后啥也没有,这样咱们把这个目录与tomcat的webapps目录绑定之后,访问tomcat还是没有页面,因为咱们宿主机的webapps空空如也,咱们现在添加一个html页面。然后重启这个容器。
在vim的文件里随便写句话就行,不用写HTML代码。
在电脑浏览器上访问192.168.191.138:8080/test/index.html
实现多个容器之间进行数据共享。
参数:
- create # 创建数据卷
- inspect #查看数据卷元数据
- ls #查看数据卷列表
- prune #删除所有未使用的卷
- rm #删除数据卷
- #创建数据卷
- [root@localhost test]# docker volume create test_web
- test_web
- ##查看数据卷列表
- [root@localhost test]# docker volume ls
- DRIVER VOLUME NAME
- local 15b7507fd76c1c7e793780e2c3fc88564f55cc5905454b2b087b52b0d43ed041
- local test_web
- #查看数据卷元数据
- [root@localhost test]# docker volume inspect test_web
- [
- {
- "Driver": "local",
- "Labels": {},
- "Mountpoint": "/var/lib/docker/volumes/test_web/_data",
- "Name": "test_web",
- "Options": {},
- "Scope": "local"
- }
- ]
- #这个路径下保存了docker的各种文件
- [root@localhost test]# cd /var/lib/docker/
- [root@localhost docker]# ls
- containers image network overlay2 plugins swarm tmp trust volumes
- [root@localhost docker]# cd /var/lib/docker/volumes/test_web/_data
- [root@localhost _data]# ls
- [root@localhost _data]# mkdir test
- [root@localhost _data]# cd test/
- [root@localhost test]# vim index.html
- #查看运行中的容器
- [root@localhost test]# docker ps
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- #显式所有容器
- [root@localhost test]# docker ps -a
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 29cb2fd3634e tomcat "catalina.sh run" 29 minutes ago Exited (143) 24 minutes ago mytomcat
- 44bed10f18b6 mysql:5.7 "docker-entrypoint..." 12 hours ago Exited (0) About an hour ago mysql
- 4b253ba77689 java "java -version" 14 hours ago Exited (0) 14 hours ago eager_fermi
- 7ce7bdf289d8 hello-world "/hello" 17 hours ago Exited (0) 17 hours ago hardcore_nightingale
- 81547f6c4634 hello-world "/hello" 42 hours ago Exited (0) 42 hours ago gracious_golick
- #利用tomcat镜像新建一个tomcat容器,注意这次的路径绑定用了数据卷容器名替换了宿主机目录路径!
- [root@localhost test]# docker run -d --name mytomcat1 -p 8080:8080 -v test_web:/usr/local/tomcat/webapps tomcat
- e933a93178de940b474700c758408d15fdb2409667c3d52ce61ee754915d9363
- [root@localhost test]# docker ps -a
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- e933a93178de tomcat "catalina.sh run" 8 seconds ago Up 8 seconds 0.0.0.0:8080->8080/tcp mytomcat1
- 29cb2fd3634e tomcat "catalina.sh run" 31 minutes ago Exited (143) 26 minutes ago mytomcat
- 44bed10f18b6 mysql:5.7 "docker-entrypoint..." 12 hours ago Exited (0) About an hour ago mysql
- 4b253ba77689 java "java -version" 14 hours ago Exited (0) 14 hours ago eager_fermi
- 7ce7bdf289d8 hello-world "/hello" 17 hours ago Exited (0) 17 hours ago hardcore_nightingale
- 81547f6c4634 hello-world "/hello" 42 hours ago Exited (0) 42 hours ago gracious_golick
注意:-v代表挂载数据卷,这里使用自定数据卷test_web,并且将数据卷挂载到/usr/local/tomcat/webapps 。如果没有通过-v指定,那么Docker会默认帮我们创建匿名数据卷进行映射和挂载。
访问成功!以后想实现多个容器之间进行数据共享就可以这样,比如多个容器挂载时都把宿主机目录写成同一个,eg:test_web
数据卷挂载解决Mysql数据丢失问题。
搜索镜像
docker search mysql:5.7
docker pull mysql:5.7
- #之前已经下载过mysql镜像,所以我们选择直接run,并进行挂载绑定等参数设置
- [root@localhost seven]# docker run -d -p 3306:3306 \
- > -v /opt/mysql/conf:/etc/mysql/conf.d \
- > -v /opt/mysql/data:/var/lib/mysql \
- > -e MYSQL_ROOT_PASSWORD=123456 --name my_mysql mysql:5.7
- #返回一个容器id号
- 33b472f8eec2bb2e7d5491427bf9546285725a11c5989f49620aebc3164a1d57
- #进入mysql容器里
- [root@localhost seven]# docker exec -it 33 /bin/bash
- #登录数据库
- root@33b472f8eec2:/# mysql -uroot -p
- Enter password:
- Welcome to the MySQL monitor. Commands end with ; or \g.
- Your MySQL connection id is 2
- Server version: 5.7.36 MySQL Community Server (GPL)
-
- Copyright (c) 2000, 2021, Oracle and/or its affiliates.
-
- Oracle is a registered trademark of Oracle Corporation and/or its
- affiliates. Other names may be trademarks of their respective
- owners.
-
- Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
-
- mysql> show databases;
- +--------------------+
- | Database |
- +--------------------+
- | information_schema |
- | mysql |
- | performance_schema |
- | sys |
- +--------------------+
- 4 rows in set (0.01 sec)
-
- mysql> create database test;
- Query OK, 1 row affected (0.05 sec)
-
- mysql> use test;
- Database changed
- mysql> create table dog(id int,name varchar(255));
- Query OK, 0 rows affected (0.06 sec)
-
- mysql> insert into dog value(1,"tom");
- Query OK, 1 row affected (0.04 sec)
-
- mysql> select * from dog;
- +------+------+
- | id | name |
- +------+------+
- | 1 | tom |
- +------+------+
- 1 row in set (0.00 sec)
-
- mysql> exit
- Bye
- root@33b472f8eec2:/# exit
- exit
- [root@localhost seven]# docker ps
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 33b472f8eec2 mysql:5.7 "docker-entrypoint..." 6 minutes ago Up 6 minutes 0.0.0.0:3306->3306/tcp, 33060/tcp my_mysql
- #停止并卸载mysql容器
- [root@localhost seven]# docker stop 33
- 33
- [root@localhost seven]# docker rm 33
- 33
- #下面的命令时进入到挂载的宿主机的目录里查看是否有东西(数据持久化,所以数据都已保存在这里,
- #不会因为删除容器而导致数据丢失)
- [root@localhost seven]# cd /opt
- [root@localhost opt]# ls
- mysql rh webapps
- [root@localhost opt]# cd mysql/
- [root@localhost mysql]# ls
- conf data
- [root@localhost mysql]# cd data/
- [root@localhost data]# ls
- auto.cnf client-cert.pem ibdata1 mysql public_key.pem sys
- ca-key.pem client-key.pem ib_logfile0 performance_schema server-cert.pem test
- ca.pem ib_buffer_pool ib_logfile1 private_key.pem server-key.pem
- [root@localhost data]# docker ps
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- [root@localhost data]# docker ps -a
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- e933a93178de tomcat "catalina.sh run" 3 hours ago Exited (143) 2 hours ago mytomcat1
- 29cb2fd3634e tomcat "catalina.sh run" 3 hours ago Exited (143) 3 hours ago mytomcat
- 44bed10f18b6 mysql:5.7 "docker-entrypoint..." 15 hours ago Exited (0) 5 hours ago mysql
- 4b253ba77689 java "java -version" 18 hours ago Exited (0) 18 hours ago eager_fermi
- 7ce7bdf289d8 hello-world "/hello" 20 hours ago Exited (0) 20 hours ago hardcore_nightingale
- 81547f6c4634 hello-world "/hello" 45 hours ago Exited (0) 45 hours ago gracious_golick
- #下面的操作时重新启动数据库然后进行查找,发现依然能够查找到数据
- #说明数据并没有因为删除容器而丢失
- [root@localhost data]# docker run -d -p 3306:3306 -v /opt/mysql/conf:/etc/mysql/conf.d -v /opt/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name my_mysql mysql:5.7
- 23fdffe2f34113782fa3de85e6ce8c193e3e0db7b6cba05c7e57014b3ed8d23b
- [root@localhost data]# docker exec -it 23 /bin/bash
- root@23fdffe2f341:/# mysql -uroot -p
- Enter password:
- Welcome to the MySQL monitor. Commands end with ; or \g.
- Your MySQL connection id is 2
- Server version: 5.7.36 MySQL Community Server (GPL)
-
- Copyright (c) 2000, 2021, Oracle and/or its affiliates.
-
- Oracle is a registered trademark of Oracle Corporation and/or its
- affiliates. Other names may be trademarks of their respective
- owners.
-
- Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
-
- mysql> show databases;
- +--------------------+
- | Database |
- +--------------------+
- | information_schema |
- | mysql |
- | performance_schema |
- | sys |
- | test |
- +--------------------+
- 5 rows in set (0.09 sec)
-
- mysql> use test;
- Reading table information for completion of table and column names
- You can turn off this feature to get a quicker startup with -A
-
- Database changed
- mysql> select * from test;
- ERROR 1146 (42S02): Table 'test.test' doesn't exist
- mysql> show table;
- ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
- mysql> show tables;
- +----------------+
- | Tables_in_test |
- +----------------+
- | dog |
- +----------------+
- 1 row in set (0.00 sec)
- mysql> select * from dog;
- +------+------+
- | id | name |
- +------+------+
- | 1 | tom |
- +------+------+
- 1 row in set (0.00 sec)
具名和匿名挂载
-V 容器内路径 #匿名挂载,系统帮我们指定了一个路径,但是没有明确告诉我们在哪,用docker inspect 容器id 可以查到,输出的信息里Mounts属性下有Source和Destination,Source就是系统给我们指定的路径,Destination就是咱们自己指定的容器内路径,这个方式一般用的少,下面两种方式用的比较多。-v 卷名:容器内路径 #具名挂载-v /宿主内路径:容器内路径 #指定路径挂载
注意:匿名挂载:卷挂载只写容器里面的路径,不写容器外的路径。
拓展
- ro readonly # 只读
- rw readwrite # 可读可写
参数:
通过 -v 容器内路径 ro rw 改变目录读写权限
看到下面的命令,路径绑定后边跟一个冒号,然后后面写权限。
- docker run -d -P --name tomcat -v my-nginx:/etc/nginx:ro tomcat
- docker run -d -P --name tomcat -v my-nginx:/etc/nginx:rw tomcat
昨天是二十大召开的日子,笔者看到祖国已经风风雨雨经历了这么多年头,到如今繁荣昌盛,心中充满了感激与自豪,希望祖国越来越好!