Docker 学习小记

版权声明:本博客所有的原创文章,转载请注明出处,作者皆保留版权。 https://blog.csdn.net/anLA_/article/details/79968142

这些天,在学Docker ,看的《Docker 技术入门与实践》,书挺不错,记录下来一些基础笔记。

基础命令

  • docker images,可以列出本镜像所有信息。
  • 使用docker inspect [imageName],可以看到该镜像的详细信息。
  • 使用docker history [imageName],可以看到该镜像的构建历史,不是有很多层layer组成嘛。
  • 使用docker search [imageName],搜索镜像:
  • docker search –automated -s 3 nginx :-s 3表示输出指定星级以上镜像,默认为0,即输出所有。 –automated,自动构建的版本
  • 使用docker rmi [imageName],删除某一个镜像或者多个。空格间隔,或者rmi后面假image id也行
  • docker commit ,创建镜像,区别于构建镜像:
anla7856@localhost:~$ docker run -it tomcat:latest /bin/bash
    root@4418d7440391:/usr/local/tomcat# ls
    LICENSE  NOTICE  RELEASE-NOTES  RUNNING.txt  bin  conf  include  lib  logs  native-jni-lib  temp  webapps  work
    root@4418d7440391:/usr/local/tomcat# touch test
    root@4418d7440391:/usr/local/tomcat# ls
    LICENSE  NOTICE  RELEASE-NOTES  RUNNING.txt  bin  conf  include  lib  logs  native-jni-lib  temp  test  webapps  work
    root@4418d7440391:/usr/local/tomcat# exit
    exit
    anla7856@localhost:~$ docker commit -m "add new file" -a "anla7856" 4418d7440391 tomcat:1.1
    sha256:f5204f579cb96962b118f8929fa59289a6ee35441f66439e3a91af061bde365c
    anla7856@localhost:~$ docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    tomcat              1.1                 f5204f579cb9        8 seconds ago       554MB
    helloworld          0.0.0.1             9570f8be1bef        26 hours ago        565MB
    recruit             0.0.4               03a79f16c3e5        29 hours ago        588MB
    recruit             0.0.3               bcd846b48852        35 hours ago        592MB
    <none>              <none>              7172c01942a8        2 days ago          730MB
    <none>              <none>              01f47b6c62f2        2 days ago          730MB
    tomcat              latest              33e02377a00f        3 days ago          554MB
    hello-world         latest              e38bc07ac18e        3 days ago          1.85kB
    mysql               latest              5195076672a7        4 weeks ago         371MB
其中,docker commit 命令参数解释如下:
Usage:  docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

Create a new image from a container's changes

Options:
  -a, --author string    Author (e.g., "John Hannibal Smith <[email protected]>")
  -c, --change list      Apply Dockerfile instruction to the created image
  -m, --message string   Commit message
  -p, --pause            Pause container during commit (default true)

- docker import 基于本地模板导入:

    anla7856@localhost:~/file$ cat apache-maven-3.5.3-src.tar.gz | docker import - maven:3.5.3
    sha256:c481adb6e0fe0df498c81e6c86584ba3ba5e965d3842e55bce4ea856067a6c7f
    anla7856@localhost:~/file$ docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    maven               3.5.3               c481adb6e0fe        7 seconds ago       8.34MB
  • docker save 导出镜像,可以把一个image,导出为tar文件:
    anla7856@localhost:~/file$ docker save -o tomcat-latest.tar tomcat:latest
    anla7856@localhost:~/file$ ls |grep tomcat-la
    tomcat-latest.tar
    anla7856@localhost:~/file$ 
  • docker load 载入镜像
    anla7856@localhost:~/file$ docker load --input tomcat-latest.tar
    Loaded image: tomcat:latest

如果系统有重名的,即imageName和tar都一致,不会覆盖。可以从生成时间上看出来。

  • Dockerfile里面的workDir,是为以后的RUN,CMD,ENTRYPOINT指定配置工作目录的。
  • docker build -t ,-t代表标签信息。
  • 创建容器:docker create,创建一个容器,但是容器处于停止状态,可以用docker start命令来启动它。
  • 进入容器:当带有-d在后台运行时候,则有时需要进入容器:
    attach命令:
anla7856@localhost:~/file$ docker run -itd tomcat:latest 
    a592bf589b031ed1e8e26a42168becb150c31716d7550f14026e5ec675fc999f
    anla7856@localhost:~/file$ docker container ls
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    a592bf589b03        tomcat:latest       "catalina.sh run"   7 seconds ago       Up 5 seconds        8080/tcp            cranky_bose
    anla7856@localhost:~/file$ docker attach cranky_bose
    exec命令:可以在容器内直接执行任意命令。
    anla7856@localhost:~/file$ docker run -itd tomcat:latest 
    1b962404e27ab7d460471d2de64b143247d3443ac49adb619fabf40cb12a3a3b
    anla7856@localhost:~/file$ docker container ls
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    1b962404e27a        tomcat:latest       "catalina.sh run"   18 seconds ago      Up 16 seconds       8080/tcp            affectionate_galileo
    anla7856@localhost:~/file$ docker exec -it 1b962404e27a /bin/bash
    root@1b962404e27a:/usr/local/tomcat# ls
    LICENSE  RELEASE-NOTES  bin   include  logs        temp work
    NOTICE   RUNNING.txt    conf  lib      native-jni-lib  webapps
    root@1b962404e27a:/usr/local/tomcat# 
  • 导入和导出文件
    docker export和docker import:
    docker export -o *.tar [containerid]
    docker import *.tar [repositoryName] : docker images的第一列。

第二弹:

  1. 查看docker版本:
    docker version 或者 docker info
  2. 运行本机docker服务:
    service 命令的用法: sudo service docker start
    systemctl 命令的用法: sudo systemctl start docker
  3. 文件查看等:
    列出本机的所有 image 文件:docker image ls
    删除 image 文件:docker image rm [imageName] :为repository:tag
    这样只能删除已经停止的容器,并不能删除运行状态下容器,如果要强行删除运行状态下容器,则需要假-f,原理也是先停止。
  4. 从官方仓库中拉取docker,默认是从library下面
    docker image pull library/hello-world
    即这样也是从library下面:
    docker image pull hello-world
  5. 运行一个image
    docker container run hello-world
    某些时候,run命令可能会出错:
    125:Docker daemon执行出错,例如指定了不支持的docker命令参数
    126:所指定命令无法执行,例如权限出错
    127:容器内命令无法找到。
  6. 杀死不会自动终止的容器:
    docker container kill [containID]
    过程:首先会像容器发送一个SIGTERM信号,等待一段超过时间(默认为10s)后,再发送SIGKILL信号。
  7. 查看文件:可以查看到容器id
    列出本机正在运行的容器:docker container ls
    列出本机所有容器,包括终止运行的容器:docker container ls --all
  8. 运行容器:
    docker container run -p 8000:3000 -it recruit /bin/bash
    参数用途:
    -p参数:容器的 3000 端口映射到本机的 8000 端口。
    -it参数:容器的 Shell 映射到当前的 Shell,然后你在本机窗口输入的命令,就会传入容器。
    koa-demo:0.0.1:image 文件的名字(如果有标签,还需要提供标签,默认是 latest 标签)。
    /bin/bash:容器启动以后,内部第一个执行的命令。这里是启动 Bash,保证用户可以使用 Shell。
  9. CMD命令
    我们可以把这个命令写在 Dockerfile 里面,这样容器启动以后,这个命令就已经执行了,不用再手动输入了。

  10. CMD命令和RUN命令区别:
    你可能会问,RUN命令与CMD命令的区别在哪里?简单说,RUN命令在 image 文件的构建阶段执行,执行结果都会打包进入 image 文件;CMD命令则是在容器启动后执行。另外,一个 Dockerfile 可以包含多个RUN命令,但是只能有一个CMD命令。

    注意,指定了CMD命令以后,docker container run命令就不能附加命令了(比如前面的/bin/bash),否则它会覆盖CMD命令。现在,启动容器可以使用下面的命令。

  11. 发布image文件
    一注册:去hub.docker.com里面注册
    二登录: docker login
    三标注image的用户名和版本:
    $ docker image tag [imageName] [username]/[repository]:[tag]
    # 实例
    $ docker image tag koa-demos:0.0.1 ruanyf/koa-demos:0.0.1
    四发布image文件:$ docker image push [username]/[repository]:[tag]
  12. docker container start [containerID]
    前面的docker container run命令是新建容器,每运行一次,就会新建一个容器。同样的命令运行两次,就会生成两个一模一样的容器文件。如果希望重复使用容器,就要使用docker container start命令,它用来启动已经生成. 已经停止运行的容器文件。
  13. docker container stop [containerID]
    前面的docker container kill命令终止容器运行,相当于向容器里面的主进程发出 SIGKILL 信号。而docker container stop命令也是用来终止容器运行,相当于向容器里面的主进程发出 SIGTERM 信号,然后过一段时间再发出 SIGKILL 信号。
  14. docker container logs [containerID]
    docker container logs命令用来查看 docker 容器的输出,即容器里面 Shell 的标准输出。如果docker run命令运行容器的时候,没有使用-it参数,就要用这个命令查看输出。
  15. docker container exec [containerID] /bin/bash
    docker container exec命令用于进入一个正在运行的 docker 容器。如果docker run命令运行容器的时候,没有使用-it参数,就要用这个命令进入容器。一旦进入了容器,就可以在容器的 Shell 执行命令了。
  16. docker container cp [containID]:[/path/to/file]
    docker container cp命令用于从正在运行的 Docker 容器里面,将文件拷贝到本机。下面是拷贝到当前目录的写法。
  17. docker container run 小结:
$ docker container run \
      --rm \
      --name wordpress \
      --volume "$PWD/":/var/www/html \
      php:5.6-apache

解释:
--rm:停止运行后,自动删除容器文件。
--name wordpress:容器的名字叫做wordpress。
--volume "$PWD/":/var/www/html:将当前目录($PWD)映射到容器的/var/www/html(Apache 对外访问的默认目录)。因此,当前目录的任何修改,都会反映到容器里面,进而被外部访问到。

    $ docker container run \
      -d \
      --rm \
      --name wordpressdb \
      --env MYSQL_ROOT_PASSWORD=123456 \
      --env MYSQL_DATABASE=wordpress \
      mysql:5.7

解释:
-d:容器启动后,在后台运行。
--rm:容器终止运行后,自动删除容器文件。
--name wordpressdb:容器的名字叫做wordpressdb
--env MYSQL_ROOT_PASSWORD=123456:向容器进程传入一个环境变量MYSQL_ROOT_PASSWORD,该变量会被用作 MySQL 的根密码。
--env MYSQL_DATABASE=wordpress:向容器进程传入一个环境变量MYSQL_DATABASE,容器里面的 MySQL 会根据该变量创建一个同名数据库(本例是WordPress)。

$ docker container run \
      --rm \
      --name wordpress \
      --volume "$PWD/":/var/www/html \
      --link wordpressdb:mysql \
      phpwithmysql

解释:
中间 link意思是:
--link wordpressdb:mysql,表示 WordPress 容器要连到wordpressdb容器,冒号表示该容器的别名是mysql
18. 使用docker-compose命令:
首先docker-compose.yml文件示例:

    mysql:
        image: mysql:5.7
        environment:
         - MYSQL_ROOT_PASSWORD=123456
         - MYSQL_DATABASE=wordpress
    web:
        image: wordpress
        links:
         - mysql
        environment:
         - WORDPRESS_DB_PASSWORD=123456
        ports:
         - "127.0.0.3:8080:80"
        working_dir: /var/www/html
        volumes:
         - wordpress:/var/www/html

运行 docker-compose up
停止:docker-compose stop
上面的文件表示:
关闭以后,这两个容器文件还是存在的,写在里面的数据不会丢失。下次启动的时候,还可以复用。
命令:docker-compose rm可以把这两个容器文件删除(容器必须已经停止运行)。
19. dockerfile镜像时候,包括很多层(layer),以不同id标识:6c953ac5d795,如果不同版本镜像有相同的层,本地只会保存一份。
20. docker 容器概念:就是镜像的一个运行实例,镜像是静态的只读文件,而容器是带有运行时需要的可写文件层。
21. docker的注册服务器和仓库名:
仓库/repository是用来存镜像地方,注册服务器registry,里面可以有很多仓库。
例如:anla7856.com/recruit
anla7856.com是注册服务器,而recruit是仓库名。
如果是anla7856/recruit
则是由anla7856创建的,并维护的一个镜像recruit。
22. 可以从注册服务器的拉镜像,然后让他与官方保持一致:
docker pull index.anla7856.com/library/tomcat:latest
然后用tag命令,更新镜像标签,让其与官方标签一致:
docker tag index.anla7856.com/library/tomcat:latest tomcat:latest
23. 数据卷:容器内数据直接映射到本地主机环境
docker run -d -p --name web -v /src/webapp:/opt/webapp training/webapppython app.py
同样,也可以挂载一个文件作为数据卷。
数据卷容器:使用特定容器维护数据卷,可以在容器和主机,容器和容器之间共享数据,并实现数据的备份与恢复。
docker run -it -v /dbdata --name dbdata ubuntu 即在ubuntu容器内,创建一个数据卷/dbdata.即根木录下有个dbdata文件夹
同时,多个相同的镜像运行时,也可以共有着一个数据卷使用--volumes-from
docker run -it --volumes-from dbdate --name db1 ubuntu
docker run -it --volumes-from dbdate --name db2 ubuntu
把容器db1和db2都挂载在同一个相同的/dbdata目录。即/dbdata这个目录三个文件操作都能看得到。
24. 容器具有自己的内部网络和ip地址,使用docker+inspect+容器id可以获取具体信息。
25. 容器互联,可以让多个容器应用快速交互的方式,它会在源和接受容器之间创建连接关系,接受容器可以通过容器快速访问到源容器。
-rm和-d不能同时使用
互联用–link参数
创建一个db1:anla7856@localhost:~/file$ docker run -d --name db1 postgres
然后web1连接到db1:anla7856@localhost:~/file$ docker run -d -P --name web1 --link db1:db tomcat
查看web1里面的环境变量:

PATH=/usr/local/tomcat/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
        HOSTNAME=18a460c09d1c
        TERM=xterm
        DB_PORT=tcp://172.17.0.2:5432
        DB_PORT_5432_TCP=tcp://172.17.0.2:5432
        DB_PORT_5432_TCP_ADDR=172.17.0.2
        DB_PORT_5432_TCP_PORT=5432
        DB_PORT_5432_TCP_PROTO=tcp
        DB_NAME=/web1/db

查看web1里面的host文件:

扫描二维码关注公众号,回复: 3285112 查看本文章
    anla7856@localhost:~/file$ docker exec -it 18 /bin/bash
    root@18a460c09d1c:/usr/local/tomcat# cat /etc/hosts
    127.0.0.1   localhost
    ::1 localhost ip6-localhost ip6-loopback
    fe00::0 ip6-localnet
    ff00::0 ip6-mcastprefix
    ff02::1 ip6-allnodes
    ff02::2 ip6-allrouters
    172.17.0.2  db 88be8db95341 db1
    172.17.0.3  18a460c09d1c

可知,对于–link原理就是更改host直接访问的。

猜你喜欢

转载自blog.csdn.net/anLA_/article/details/79968142
今日推荐