[TOC] ## 守护进程 `docker run --restart=always -d -p 8080:7890 ...` #### 进入交互页面 如: `docker run -it --rm ubuntu:14.04 bash` ``` -it: -i:交互式操作, -t 终端。我们这里打算进入 bash 执行一些命令并查看返回结果,因此我们需要交互式终端。 --rm:这个参数是说容器退出后随之将其删除。默认情况下,并不会立即删除,除非手动 docker rm。 bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 ``` #### 后台运行容器 如 `docker run -d -p 8086:8086 --name my_influxdb influxdb` ``` -p : 映射端口 -d : 后台运行 --name : 指定容器名称 ``` #### 执行容器中的方法 `docker run -v $PWD/:/usr/src/go -w /usr/src/go golang go run test.go` ``` -v $PWD/:/usr/src/go 当前目录映射到/usr/src/go -w /usr/src/go 容器当前工作目录 golang 指定容器名 ``` ## 一个容器进入多个窗口 attach 只能进入一个窗口,多个窗口下,命令也会同步显示 于是使用 exec 命令 如: 进入 go 容器中,同时运行 server.go 与 client.go ``` docker run -itd -v $PWD:/usr/src/go -w /usr/src/go golang > e9526ca88dc... //窗口一 docker exec -it e9526ca8 bash go run server.go //窗口二 docker exec -it e9526ca8 bash //另起一窗口,执行 go run client.go ``` ## 清理所有处于终止状态的容器 查看所有已创建的容器 `docker ps -a` 清除所有终止状态的容器 `docker rm $(docker ps -a -q)` ## Dockerfile 制作镜像 Dockerfile ``` FROM nginx RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html ``` ``` docker build -t nginx:v3 ./ 注释: -t 指定仓库与标签 ./ 为上下文的目录,所以不能那个绝对路劲,或者 ../ Dockerfile 无法理解 ``` ## commit 定制镜像 在原有镜像的基础上,再叠加上容器的存储层,并构成新的镜像 ### 进入创建的容器,修改内容 ``` //访问 localhost:81/查看输出内容 docker run --name webserver -d -p 81:80 nginx //查看内容是否变化 docker exec -it webserver bash > echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html > exit ``` ### docker diff 查看修改了哪些容器 `docker diff webserver` ### 把修改过的容器 commit 为新版本 ``` docker commit \ --author "Tao Wang <twang2218@gmail.com>" \ --message "修改了默认网页" \ webserver \ nginx_idcpj:v2 //注释: --author 作者,非必须 --message 修改内容 nginx_idcpj:v2 设置仓库与版本,可写与现有仓库名称一致,标签不一致 nginx:v2 ``` ### 运行新提交的容器 `docker run --name web2 -d -p 81:80 nginx_idcpj:v2` ### 慎用 docker commit 使用 `docker commit` 意味着所有对镜像的操作都是黑箱操作,生成的镜像也被称为黑箱镜像,换句话说,就是除了制作镜像的人知道执行过什么命令、怎么生成的镜像,别人根本无从得知 ### 推荐 Dockerfile,查看 `Dockerfile 定制镜像` 目录 ## 上传本地所有镜像到注册服务器(内网服务器) [这个脚本](https://github.com/yeasy/docker_practice/raw/master/_local/push_images.sh) 默认是本地注册服务器 `127.0.0.1:5000` ``` $ wget https://github.com/yeasy/docker_practice/raw/master/_local/push_images.sh; sudo chmod a+x push_images.sh $ ./push_images.sh ubuntu:latest centos:centos7 The registry server is 127.0.0.1 ``` ## docker 容器由于配置错误,无法启动 格式:`docker cp 容器id:docker容器中配置文件路径 主机路径` eg: `docker cp eaaba6bd4423:/etc/mysql/mysql.conf.d/mysqld.cnf /root/mysqld.cnf ` 修改完后在复制回去 `docker cp /root/mysqld.cnf eaaba6bd4423:/etc/mysql/mysql.conf.d/mysqld.cnf `