这些天,在学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 <hannibal@a-team.com>")
-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的第一列。
第二弹:
- 查看docker版本:
docker version 或者 docker info - 运行本机docker服务:
service 命令的用法:sudo service docker start
systemctl 命令的用法:sudo systemctl start docker
- 文件查看等:
列出本机的所有 image 文件:docker image ls
删除 image 文件:docker image rm [imageName]
:为repository:tag
这样只能删除已经停止的容器,并不能删除运行状态下容器,如果要强行删除运行状态下容器,则需要假-f,原理也是先停止。 - 从官方仓库中拉取docker,默认是从library下面
docker image pull library/hello-world
即这样也是从library下面:
docker image pull hello-world
- 运行一个image
docker container run hello-world
某些时候,run命令可能会出错:
125:Docker daemon执行出错,例如指定了不支持的docker命令参数
126:所指定命令无法执行,例如权限出错
127:容器内命令无法找到。 - 杀死不会自动终止的容器:
docker container kill [containID]
过程:首先会像容器发送一个SIGTERM
信号,等待一段超过时间(默认为10s)后,再发送SIGKILL
信号。 - 查看文件:可以查看到容器id
列出本机正在运行的容器:docker container ls
列出本机所有容器,包括终止运行的容器:docker container ls --all
- 运行容器:
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。 CMD命令
我们可以把这个命令写在 Dockerfile 里面,这样容器启动以后,这个命令就已经执行了,不用再手动输入了。CMD命令和RUN命令区别:
你可能会问,RUN命令与CMD命令的区别在哪里?简单说,RUN命令在 image 文件的构建阶段执行,执行结果都会打包进入 image 文件;CMD命令则是在容器启动后执行。另外,一个 Dockerfile 可以包含多个RUN命令,但是只能有一个CMD命令。注意,指定了CMD命令以后,docker container run命令就不能附加命令了(比如前面的/bin/bash),否则它会覆盖CMD命令。现在,启动容器可以使用下面的命令。
- 发布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]
docker container start [containerID]
前面的docker container run
命令是新建容器,每运行一次,就会新建一个容器。同样的命令运行两次,就会生成两个一模一样的容器文件。如果希望重复使用容器,就要使用docker container start
命令,它用来启动已经生成. 已经停止运行的容器文件。docker container stop [containerID]
前面的docker container kill命令终止容器运行,相当于向容器里面的主进程发出 SIGKILL 信号。而docker container stop命令也是用来终止容器运行,相当于向容器里面的主进程发出 SIGTERM 信号,然后过一段时间再发出 SIGKILL 信号。docker container logs [containerID]
docker container logs
命令用来查看 docker 容器的输出,即容器里面 Shell 的标准输出。如果docker run命令运行容器的时候,没有使用-it参数,就要用这个命令查看输出。docker container exec [containerID] /bin/bash
docker container exec
命令用于进入一个正在运行的 docker 容器。如果docker run
命令运行容器的时候,没有使用-it参数,就要用这个命令进入容器。一旦进入了容器,就可以在容器的 Shell 执行命令了。docker container cp [containID]:[/path/to/file]
docker container cp
命令用于从正在运行的 Docker 容器里面,将文件拷贝到本机。下面是拷贝到当前目录的写法。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/webapp
python 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文件:
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直接访问的。