记录一下docker的学习过程


官网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

解决:

  1. 先停止docker systemctl stop docker
  2. 然后 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…

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然,我会帮助你记录学习Docker的知识点。下面是一份Docker学习笔记: 1. 什么是DockerDocker是一个开源的容器化平台,可以帮助开发者创建、打包、部署和运行应用程序,使应用程序可以在不同的环境中无缝运行。 2. Docker的优势有哪些? - 轻量化:Docker容器与虚拟机相比更加轻量级,启动和停止速度更快。 - 可移植性:Docker容器可以在任何支持Docker的平台上运行,无需担心环境不一致的问题。 - 隔离性:Docker使用容器技术进行隔离,每个容器之间相互独立,不会相互影响。 - 效率:Docker可以将应用程序及其依赖项打包为一个镜像,部署和扩展非常方便。 3. Docker常用的概念: - 镜像(Image):一个只读的模板,包含了运行应用程序所需的所有文件和依赖项。 - 容器(Container):基于镜像创建的可执行实例,可以运行、停止、删除等操作。 - 仓库(Registry):用于存储和分享镜像的地方,常用的有Docker Hub。 - Dockerfile:用于定义镜像构建过程的文本文件,包含了一系列的指令和配置。 4. Docker基本使用命令: - `docker pull <image-name>`:从仓库中拉取指定镜像。 - `docker run <image-name>`:创建并运行一个新的容器。 - `docker ps`:查看当前正在运行的容器。 - `docker stop <container-id>`:停止指定容器的运行。 - `docker rm <container-id>`:删除指定容器。 - `docker rmi <image-name>`:删除指定镜像。 5. Docker常见应用场景: - 镜像管理:可以通过Docker镜像进行应用程序开发、测试和部署。 - 微服务架构:通过容器化实现应用程序的模块化,方便管理和扩展。 - CI/CD:在持续集成和持续部署过程中使用Docker来构建、测试和发布应用程序。 这些是Docker学习过程中的一些基础知识点和常用命令。希望对你有帮助!如果你还有其他问题,可以随时问我。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值