EdwardWong
2022/08/29阅读:38主题:兰青
Docker
此文简单的介绍了docker的使用,由于初学,之后会陆续添加内容。
容器
-
one way to package applciation with all the necessary dependency and configuration -
portable artifact, easy shared and move around -
make development and deployment more efficient
简而言之,docker可以使你免受环境配置的困扰。
容器和镜像的区别: 镜像就是实际的安装包,而容器就是运行的安装包,就是程序和运行的程序的区别。镜像一般存放在私人仓库或者公共仓库中,Docker Hub存放了多个版本的仓库源。
也可以使用docker search
命令来搜索镜像。
有时候我们从docker镜像仓库中下载的镜像不能满足我们的需求时,我们可以用以下方式对镜像进行更改:
-
从已经创建的容器中更新镜像,并且提交这个镜像 -
使用dockerfile指令创建新的镜像
在已有的镜像源基础上更新镜像源
-
docker run -it ubuntu:15.10 /bin/bash
-
运行apt-get update 或者做其他配置 % 比如容器中无ping命令,可以添加进去然后形成新的镜像。 -
docker commit -m="has update" -a="edward" based containerid edward/ubuntu:v2
-
m:提交的描述信息 -
a: 指定镜像作者 -
based container ID 基于那个容器生成 -
edward/ubuntu:v2 指定要创建的目标镜像名
从零创建镜像源(需要dockerfile)
Dockerfile
的基本格式如下:
FROM centos:6.7 % 指定使用哪一个镜像源
MAINTAINER Fisher "fisher@sudops.com" % 维护者
% 在docker镜像内执行的命令
RUN /bin/echo "root:123456" |chpasswd
RUN useradd edward
RUN /bin/echo "edward:123456" |chpasswd
RUN /bin/echo -e "LANG=\"en_US.UTF-8\"" > /etc/default/local
EXPOSE 22
EXPOSE 80
CMD /usr/sbin.sshd -D
创建了上述Dockerfile
后,可以使用docker build -t edward/centos:6.7
-t
指定要创建的目标镜像名 可以为镜像添加一个新的标签:docker tag containerID edward/centos:dev
,这会为containerID创建一个dev
的标签。
Docker的基本命令
-
docker ps
: 列出本地上正在运行的container -
docker ps -a
: 列出所有正在运行和停止的imagesdocker ps -l
: 查看最后一次创建的容器 -
docker images
: 列出已经安装的images -
docker pull postgres:9.6
: 把postgresql9.6 拉取到本地 -
docker run postgres:9.6
: 会将镜像下载到本地并运行docker run=docker pull+ docker start
-
docker run -d postgres
: detach mode运行,即后台运行 -
docker stop + container ID
ordocker stop -t=10+ containerID
: 停止某个正在运行的容器或者10s后关闭容器 -
docker start/restart + container ID
: 开始/重启某个容器 -
docker logs container ID
: 显示某个容器的日志 -
docker network ls
: 列出所有的network id -
docker network create -d bridge +网络名
: 创建一个网络
docker network create -d bridge test-net
-d: 参数指定Docker网络类型,有bridge、overlay
-
docker run -d -p 8081:8081 -e ME_CONFIG_MONGODB_ADMINUSERNAME=admin -e ME_CONFIG_MONGODB_ADMINPASSWORD=password -e ME_CONFIG_MONGODB=mongodb --net mongo-network --name mongo-express mango
: % --name指定了container的名称, --network指定了网络, -e指定了环境变量 -p指定了端口映射, -P是端口随机映射, 第一个8081是本机的端口,第二个8081是容器的端口 -
docker rmi ImageID
: 删除iamge,在删除时需要将相关的运行的容器停止运行 -
docker rm ContainerID
: 删除容器 -
docker run -it ubuntu :15.10
: 在容器内部打开终端并进行交互式命令 -i 是交互 -t 是进入终端 -
exit
: 退出容器 -
当进入后台运行时,可以使用 docker exec -it containerID + command
或者docker attach containerID
,区别在于使用attach
会在退出容器后停止容器,而使用exec
在退出后不会导致容器的停止。 -
docker export containerID > ubuntu.tar
: 导出本地容器到本地文件ubuntu.tar -
docker ps -a
或者docker port
: 可以查看指定容器的额某个确定端口映射到宿主机的端口号 -
docker top +containerID/name
: 可以查看容器内部运行的进程 -
docker push
: 推送镜像到docker hub
docker tag ubuntu:18.04 username/ubuntu:18.04
docker push username/ubuntu:18.04
Docker容器的状态
有七种状态:
-
created(已创建) -
restarting(重启中) -
runing或者up(运行中) -
removing(迁移中) -
paused(暂停) -
exited(停止) -
dead(死亡)
Container port vs Host port
在本地机器上端口号是有限的,要注意几个正在运行的container端口号不能映射到本地相同的端口号,否则会冲突, 但是对于不同容器的端口号可以相同。 端口的绑定默认是tcp,如果要使用udp则需要在端口后面加上/udp 可以通过docker port contianerID 端口号
查看端口的绑定情况
容器互连
-
新建网络 docker network create -d bridge test-net
-
连接容器
-
运行一个容器并连接到新建的test-net网络上
docker run -itd --name test1 --network test-net ubuntu /bin/bash
-
在运行一个容器并加入test-net网络
docker run -itd --name test2 --network test-net ubuntu /bin/bash
这样两个容器之间就加入了同一个网络,从而可以实现数据共享,可以ping
通。
docker exec -it test1 /bin/bash
ping test2
Dockerfiles
Dockerfile是用来构造镜像的文本文件,包含了一条构建所需的指令和说明
FROM nginx
RUN echo "这是一个本地构建的nginx镜像" > /usr/share/nginx/html/index.html
% RUN 有两种格式
1. RUN <命令行>等同于在终端执行shell命令
2. RUN ["可执行文件", “参数1”,“参数2”]
如 RUN ["./test.php", "dev","offline"] 等价于 RUN ./test.php dev offline
docker
每执行一次命令都会在下一层的基础上新建一层,所以过多无意义的层会造成镜像膨胀,可以使用&&
连接命令
docker的运行模式是C\S
模式,docker无法使用我们本地的文件,需要我们把本机指定目录下的文件一起打包提供给docker使用。 比如 docker build -t nginx:v3 .
是把本地.
目录下的文件一起打包,如果没有指定,则默认是Dockerfile所在的位置。
COPY
命令: 与RUN
的区别是RUN是在镜像构建的时候运行的,而COPY是程序在运行的时候执行的程序。
COPY .(本地源文件) /home/app(容器内目标文件)
: 把当前目录下的文件copy到容器中的/home/app中。
CMD
命令: CMD ["可执行的文件/命令",“参数1”,“参数2”,...] docker默认要运行的程序,如果Dockerfile
中如果存在多个指令,仅最后一个生效。CMD指令指定的程序可被docker run
命令行参数中指定的程序覆盖。
ENTRYPOINT
命令
-
命令格式类似于 COPY
,不同的是不会被RUN命令行参数指定的参数覆盖,而且命令行参数会被当作参数送给ENTRYPOINT指令指定的程序。 -
当存在多个ENTRYPOINT命令时仅最后一个生效
EXPOSE
命令 声明端口。起作用是:
-
帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射 -
在运行时使用随机端口映射时,会自动随机映射EXPOSE的端口。
卷
如果退出docker后,数据会丢失,这是很得不偿失的,所以可以将容器挂在在本地的文件系统中,起作用是:
-
避免重要的数据因容器重启而丢失 -
避免容器的不断变大
VOLUME ["路径1",“路径2”] 或者 VOLUME <路径>
也可以在启动容器的时候通过-v
参数修改挂载点。docker -v /home/mount/data(host 文件):/var/lib/mysql/data(容器的文件)
或 docker -v /var/lib/mysql/data(不建议使用)
或docker -v name:/var/lib/mysql/data
Compose文件
使用Compose的三个步骤
-
使用Dockerfile定义应用程序的环境 -
使用docker-compose.yml定义构成应用程序的服务,这样他们可以在隔离环境中一起运行。 -
最后执行 docker-compose up
命令来启动并运行整个应用程序。

作者介绍