文章目录
官网docker Linux文档
官网docker Linux命令
狂神上课笔记-入门
狂神上课笔记-进阶
入门
什么是docker
拉取超时问题、阿里云镜像加速
出现的问题:
error pulling image configuration: Get https://production.cloudflare.docker.com/registry-v2/docker/registry/v2/blobs/sha256/f1/f19c56ce92a872f0f8835fb834e5549c1436515048cdf6ef09fb6cbab100e39a/data?verify=1590132099-LIG2GYkT9P9zeGBkKNLRb6KXSdo%3D: dial tcp 104.18.123.25:443: i/o timeout
解决:
- 先停止docker systemctl stop docker
- 然后 systemctl start docker
同时需要知道这是由于网络太慢的缘故,因为我们在墙内,但是可以通过阿里云镜像来加速,然后速度就不一般了。
查看镜像
[root@localhost /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat 8 f19c56ce92a8 5 days ago 529MB
nginx latest 9beeba249f3e 6 days ago 127MB
centos latest 470671670cac 4 months ago 237MB
hello-world latest bf756fb1ae65 4 months ago 13.3kB
启动容器
# 常见的坑,docker容器使用后台运行,就必须要有要一个前台进程,docker发现没有应用,就会自动停止
[root@localhost /]# docker run -d centos
a47c2e4d4b4884ba2575907330449c0d19c4c68681b491bb3dd06b16f0a307e2
[root@localhost /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 每秒打印6666
[root@localhost /]# docker run -d centos /bin/sh -c "while true;do echo 6666;sleep 1;done"
aa319309730169d15edde1f786436c94bfb22ecd88b4e8d6bf39f41632a7cf22
查看容器列表(List containers)
[root@localhost /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
aa3193097301 centos "/bin/sh -c 'while t…" 1 second ago Up 1 second awesome_meitner
[root@localhost /]#
进入容器
# 第一种方式
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
567e6503d5a9 centos "/bin/sh -c 'while t…" 54 seconds ago Up 54 seconds busy_diffie
[root@localhost ~]# docker exec -it 567e6503d5a9 /bin/bash
[root@567e6503d5a9 /]#
# 第二种方式 采用attach,会查看正在运行的东西
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
58fa4ef5967c centos "/bin/sh -c 'while t…" 7 seconds ago Up 7 seconds adoring_tereshkova
[root@localhost ~]# docker attach 58fa4ef5967c
6666
6666
区别: 使用attach 进入容器,当你使用exit退出的时候,实际上容器也会退出,而使用exec命令则不会。
查看日志
[root@localhost /]# docker logs -t --tail 10 aa3193097301
2020-05-22T07:35:40.556784804Z 6666
2020-05-22T07:35:41.560411405Z 6666
2020-05-22T07:35:42.562914212Z 6666
2020-05-22T07:35:43.566136573Z 6666
2020-05-22T07:35:44.568925283Z 6666
2020-05-22T07:35:45.571963580Z 6666
2020-05-22T07:35:46.574582500Z 6666
2020-05-22T07:35:47.578173135Z 6666
2020-05-22T07:35:48.581411060Z 6666
2020-05-22T07:35:49.585874309Z 6666
查看容器中进程信息 ps
[root@localhost /]# docker top aa3193097301
UID PID PPID C STIME TTY TIME CMD
root 3434 3418 0 15:31 ? 00:00:00 /bin/sh -c while true;do echo 6666;sleep 1;done
root 3796 3434 0 15:37 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
[root@localhost /]#
其他常用命令
安装访问nginx
# 开放端口
[root@localhost /]# iptables -A INPUT -ptcp --dport 9098 -j ACCEPT
# 端口映射启动
[root@localhost /]# docker run -d --name nginx02 -p 9098:80 nginx
e43cce8937aa286ff782006166b2dfe02a585b6c3c03511ee09c66321b3ea3df
# 查看是否启动成功
[root@localhost /]# curl localhost:9098
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
通过浏览器访问:
docker /bin/bash 后面的 bin/bash的作用
# 不带/bin/bash 无法进入
[root@localhost ceshi2]# docker exec -it 65c989743582
"docker exec" requires at least 2 arguments.
See 'docker exec --help'.
Usage: docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
Run a command in a running container
# 带了/bin/bash可以进入,然后可以使用ls等基本命令来进行交互。
[root@localhost ceshi2]# docker exec -it 65c989743582 /bin/bash
[root@65c989743582 /]# la
bash: la: command not found
[root@65c989743582 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@65c989743582 /]#
进阶部分
容器数据卷使用
什么是容器数据卷:
将应用和环境打包成一个镜像! 如果数据都在容器中,那么我们容器删除,数据就会丢失! 需求:数据可以持久化MySQL,容器删除了,删库跑路!
需求:MySQL数据可以存储在本地!容器之间可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地!这就是卷技术!目录的挂载,将我们容器内的目录,挂载到Linux上面!
容器里的文件挂载到宿主机器
[root@localhost ~]# !209
docker run -it -v /home/ceshi:/home centos
# 新建文件a
[root@6f57eddead26 home]# touch a
# 宿主机器
[root@localhost ceshi]# ls
a
# 当在宿主机器修改的时候,也会同步到docker容器里
实战安装mysql
启动一个MySQL实例很简单:
官方: docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
… where some-mysql是要分配给容器的名称,my-secret-pw是要为MySQL根用户设置的密码,并且tag是指定所需MySQL版本的标记。有关相关标签,请参见上面的列表。
# 启动mysql,并且数据挂载到宿主机器上来
[root@localhost ceshi2]# docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql
b09ad1d463a17f6b4a63c326c0bc705922117351880b66839ec1340d768393a0
[root@localhost ceshi2]#
具名和匿名挂载
# 匿名挂载
[root@localhost ceshi2]# docker run -d -P --name nginx01 -v /etc/nginx nginx
90c521b121066eb9ed2c21b90757bafb805cf3a677d62724260c0f7088c6aa19
[root@localhost ceshi2]# docker volume ls
DRIVER VOLUME NAME
local e38e40b7d15abddc8ea12ee1c1b6de95cef8adfa7bf73174742e1697d76b50cb
# 具名挂载
[root@localhost ceshi2]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
3531d8639a8a106d1883f7ab7a9e81846ab010a7906862dcd0b4f2457453b9ab
[root@localhost ceshi2]# docker volume ls
DRIVER VOLUME NAME
local e38e40b7d15abddc8ea12ee1c1b6de95cef8adfa7bf73174742e1697d76b50cb
local juming-nginx
[root@localhost ceshi2]#
查看一下这个卷
[root@localhost ceshi2]# docker volume inspect juming-nginx
[
{
"CreatedAt": "2020-05-24T15:54:37+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
"Name": "juming-nginx",
"Options": null,
"Scope": "local"
}
]
所有的docker容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/xxxx/_data下
如果指定了目录,docker volume ls 是查看不到的
三种挂载: 匿名挂载、具名挂载、指定路径挂载
-v 容器内路径 #匿名挂载
-v 卷名:容器内路径 #具名挂载
-v /宿主机路径:容器内路径 #指定路径挂载 docker volume ls 是查看不到的
初始Dockerfile
DockerFile是用来构建docker镜像的,命令参数脚本。
创建一个dockerfile文件,名字可以随便 建议Dockerfile,文件中的内容 指令(大写) 参数。
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "----end----"
CMD /bin/bash
ps: 这里的volume使用的是匿名挂载的卷
同时这里的每个命令,就是镜像的一层!
# build构建
[root@localhost docker-test]# docker build -f /home/docker-test/dockerfile01 -t kangyu/centos:1 .
Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM centos
---> 470671670cac
Step 2/4 : VOLUME ["volume01","volume02"]
---> Running in bb870cc9d470
Removing intermediate container bb870cc9d470
---> e945c6be7996
Step 3/4 : CMD echo "---end---"
---> Running in 7f0b35b2a062
Removing intermediate container 7f0b35b2a062
---> 3a13de3f60ac
Step 4/4 : CMD /bin/bash
---> Running in 58897ac0f0ad
Removing intermediate container 58897ac0f0ad
---> c372e2d5132a
Successfully built c372e2d5132a
Successfully tagged kangyu/centos:1
[root@localhost docker-test]#
[root@localhost docker-test]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
kangyu/centos 1 c372e2d5132a About a minute ago 237MB
mysql latest 30f937e841c8 3 days ago 541MB
tomcat 8 f19c56ce92a8 7 days ago 529MB
tomcat latest 1b6b1fe7261e 7 days ago 647MB
nginx latest 9beeba249f3e 8 days ago 127MB
centos latest 470671670cac 4 months ago 237MB
hello-world latest bf756fb1ae65 4 months ago 13.3kB
[root@localhost docker-test]# docker run -it c372e2d5132a
# volume01 volume02
[root@13085a56d8f2 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var volume01 volume02
上面讲了VOLUME 使用的是匿名挂载的卷,那么我们可以通过命令查看到对应的目录。
[root@localhost volumes]# docker inspect e1a21e000171
需要注意,要在容器里新增文件才能看得到Mounts…
"Mounts": [
{
"Type": "volume",
"Name": "6903f64f301ce7b9ec759acb3b4482fa003a5cb30cadc753bfd33e1363e2c936",
"Source": "/var/lib/docker/volumes/6903f64f301ce7b9ec759acb3b4482fa003a5cb30cadc753bfd33e1363e2c936/_data",
"Destination": "volume01",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
},
{
"Type": "volume",
"Name": "8f94b1ba9469373f0a21b36a7e7f1369cacd9e74cfdf54685ab00bd2d27ae0cf",
"Source": "/var/lib/docker/volumes/8f94b1ba9469373f0a21b36a7e7f1369cacd9e74cfdf54685ab00bd2d27ae0cf/_data",
"Destination": "volume02",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
测试一下刚才的文件是否同步出去了!
这种方式使用的十分多,因为我们通常会构建自己的镜像!
假设构建镜像时候没有挂载卷,要手动镜像挂载 -v 卷名:容器内路径!
多个容器之间数据共享
--volumes-from 从指定的容器挂载卷
# 从指定的容器挂载卷命令 c372e2d5132a为name=kangyucentos的镜像id
[root@localhost docker-test]# docker run --volumes-from e1a21e000171 -it --name kangyucentos02 c372e2d5132a
[root@deabf73e193b /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var volume01 volume02
这个时候当你在任意一个volume01 和 volume02之间创建文件的时候,数据都会进行同步的哦。
mysql数据共享
➜ ~ docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
➜ ~ docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7
不行…mysql02启动后会报错,没找到原因。
DockFile介绍
制作tomcat+jdk镜像
[root@localhost docker-tomcat]# ls
apache-tomcat-8.5.55 apache-tomcat-8.5.55.tar.gz dockerfile jdk1.8.0_161 jdk-8u161-linux-x64.tar.gz readme.txt
[root@localhost docker-tomcat]# cat dockerfile
FROM centos
MAINTAINER kangyu<943552821@qq.com>
COPY readme.txt /usr/local/readme.txt
ADD apache-tomcat-8.5.55.tar.gz /usr/local/
ADD jdk-8u161-linux-x64.tar.gz /usr/local/
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_161
ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.55
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib
EXPOSE 8080
CMD /usr/local/apache-tomcat-8.5.55/bin/startup.sh && tail -f /usr/local/apache-tomcat-8.5.55/logs/catalina.out
[root@localhost docker-tomcat]#
网络
- 我们每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要按照了docker,就会有一个docker0桥接模式,使用的技术是veth-pair技术!
springboot jar 通过docker启动
-
编写一个简单的springboot项目
-
编写dockerfile文件
FROM java:8 COPY *.jar /app.jar CMD ["--server.port=8082"] EXPOSE 8082 ENTRYPOINT ["java","-jar","app.jar"]
-
build dockerfile文件
docker build -t app:3.0 .
-
启动images
记得指定端口号docker run -d -p 8082:8082 --name app04 app:3.0
-
测试访问
docker现在仅仅学了,还没有在工作中的项目中使用…
end…