安装Docker
$ curl -fsSL get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh --mirror Aliyun
配置加速器
Ubuntu 16.04+、Debian 8+、CentOS 7
对于使用 systemd 的系统,请在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件)
{
"registry-mirrors": [
"https://registry.docker-cn.com"
]
}
重启docker
$ sudo systemctl restart docker
下载
从 Docker 镜像仓库获取镜像的命令是 docker pull。其命令格式为:
docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
docker pull tomcat
镜像与容器
查看镜像
docker images
docker image rm id
docker rmi id
# 删除虚悬镜像
docker image prune
启动容器
root@ubuntu:~# docker run -p 8080:8080 tomcat
#指定启动容器的名字
root@ubuntu:~# docker run -p 8080:8080 --name tomcat tomcat
# 以交互式的方式 启动容器
root@ubuntu:~# docker run -it tomcat bash
# 以交互式的方式 进入容器
root@ubuntu:~# docker exec -it id bash
root@ubuntu:~# docker pull ubuntu:16.04
root@ubuntu:~# docker run -it --rm \
> ubuntu:16.04 \
> bash
root@ac8619b035a1:/# ls
docker run 就是运行容器的命令,我们这里简要的说明一下上面用到的参数。
-it:这是两个参数,一个是 -i:交互式操作,一个是 -t 终端。我们这里打算进入 bash 执行一些命令并查看返回结果,因此我们需要交互式终端。
--rm:这个参数是说容器退出后随之将其删除。默认情况下,为了排障需求,退出的容器并不会立即删除,除非手动 docker rm。我们这里只是随便执行个命令,看看结果,不需要排障和保留结果,因此使用 --rm 可以避免浪费空间。
ubuntu:16.04:这是指用 ubuntu:16.04 镜像为基础来启动容器。
bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 bash。
守护态运行
root@ubuntu:~# docker run -P --name tomcat -d hzz
e33e8759f47a3944d2cd5fad78ca5ee3f41f2ae4a7cfd86495cc5a33cc910293
查看容器
root@ubuntu:~# docker ps -a
删除容器
root@ubuntu:~# docker rm cb6f5753e84f
删除所有未运行的容器
root@ubuntu:~# docker container prune
停止容器
# id或名字
root@ubuntu:~# docker stop ebe2d3571b05
root@ubuntu:~# docker container stop tomcat
重新启动容器
root@ubuntu:~# docker restart ab54eb8dabd8
Dockerfile
FROM 指定基础镜像
RUN 执行命令
shell 格式:RUN <命令>,就像直接在命令行中输入的命令一样。刚才写的 Dockerfile 中的 RUN 指令就是这种格式。
exec 格式:RUN [“可执行文件”, “参数1”, “参数2”],这更像是函数调用中的格式。
#Dockerfile
FROM tomcat
RUN echo "hello docker" > /usr/local/tomcat/webapps/ROOT/index.html
构建镜像
root@ubuntu:/usr/local/docker/tomcat# docker build -t hzz .
镜像构建上下文(Context)
如果注意,会看到 docker build 命令最后有一个 .。. 表示当前目录,而 Dockerfile 就在当前目录,因此不少初学者以为这个路径是在指定 Dockerfile 所在路径,这么理解其实是不准确的。如果对应上面的命令格式,你可能会发现,这是在指定上下文路径。
COPY 复制文件
COPY <源路径>... <目标路径>
COPY ["<源路径1>",... "<目标路径>"]
ADD 更高级的复制文件
ADD 指令和 COPY 的格式和性质基本一致。但是在 COPY 基础上增加了一些功能。
比如 <源路径> 可以是一个 URL,这种情况下,Docker 引擎会试图去下载这个链接的文件放到 <目标路径> 去。下载后的文件权限自动设置为 600,如果这并不是想要的权限,那么还需要增加额外的一层 RUN 进行权限调整,另外,如果下载的是个压缩包,需要解压缩,也一样还需要额外的一层 RUN 指令进行解压缩。所以不如直接使用 RUN 指令,然后使用 wget 或者 curl 工具下载,处理权限、解压缩、然后清理无用文件更合理。因此,这个功能其实并不实用,而且不推荐使用。
如果 <源路径> 为一个 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,ADD 指令将会自动解压缩这个压缩文件到 <目标路径> 去。
端口映射
生成随机端口映射容器
root@ubuntu:~# docker run -P hzz
使用宿主机端口 8080 映射 容器8080端口
root@ubuntu:~# docker run -p 8080:8080 hzz
CMD 容器启动命令
CMD 指令的格式和 RUN 相似,也是两种格式:
shell 格式:CMD <命令>
exec 格式:CMD [“可执行文件”, “参数1”, “参数2”…]
参数列表格式:CMD [“参数1”, “参数2”…]。在指定了 ENTRYPOINT 指令后,用 CMD 指定具体的参数。
EXPOSE 暴露端口
格式为 EXPOSE <端口1> [<端口2>…]。
数据卷
root@ubuntu:/usr/local/docker/tomcat/ROOT# docker run -p 8080:8080 --name tomcat -d -v /usr/local/docker/tomcat/ROOT:/usr/local/tomcat/webapps/ROOT tomcat
启动mysql
docker run -p 3306:3306 --name mysql \
-v /usr/local/docker/mysql/conf:/etc/mysql \
-v /usr/local/docker/mysql/logs:/var/log/mysql \
-v /usr/local/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7.22
-p 3306:3306:将容器的3306端口映射到主机的3306端口
-v /usr/local/docker/mysql/conf:/etc/mysql:将主机当前目录下的 conf 挂载到容器的 /etc/mysql
-v /usr/local/docker/mysql/logs:/var/log/mysql:将主机当前目录下的 logs 目录挂载到容器的 /var/log/mysql
-v /usr/local/docker/mysql/data:/var/lib/mysql:将主机当前目录下的 data 目录挂载到容器的 /var/lib/mysql
-e MYSQL_ROOT_PASSWORD=123456:初始化root用户的密码
复制容器内容到主机
root@ubuntu:/usr/local/docker/mysql/conf# docker cp mysql:/etc/mysql .
Docker-compose
安装Docker-compose
root@ubuntu:/etc/docker# curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
root@ubuntu:/etc/docker# cd /usr/local/bin/
root@ubuntu:/usr/local/bin# chmod +x docker-compose
root@ubuntu:/usr/local/bin# docker-compose version
docker-compose version 1.22.0, build f46880fe
docker-py version: 3.4.1
CPython version: 3.6.6
OpenSSL version: OpenSSL 1.1.0f 25 May 2017
docker-compose.yml
root@ubuntu:/usr/local/docker/tomcat# vim docker-compose.yml
root@ubuntu:/usr/local/docker/tomcat# cat docker-compose.yml
version: '3'
services:
tomcat:
restart: always
image: tomcat
container_name: tomcat
ports:
- 8080:8080
启动docker-compose
root@ubuntu:/usr/local/docker/tomcat# docker-compose up
docker-compose mysql配置
version: '3.1'
services:
mysql:
restart: always
image: mysql:5.7.22
container_name: mysql
ports:
- 3306:3306
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 123456
command:
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
--lower_case_table_names=1
--max_allowed_packet=128M
--sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO"
volumes:
- mysql-data:/var/lib/mysql
volumes:
mysql-data:
GitLab docker-compose配置
version: '3'
services:
web:
image: 'twang2218/gitlab-ce-zh'
restart: always
hostname: '192.168.85.132'
environment:
TZ: 'Asia/Shanghai'
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://192.168.85.132'
gitlab_rails['gitlab_shell_ssh_port'] = 2222
unicorn['port'] = 8888
nginx['listen_port'] = 80
ports:
- '80:80'
- '8443:443'
- '2222:22'
volumes:
- /usr/local/docker/gitlab/config:/etc/gitlab
- /usr/local/docker/gitlab/data:/var/opt/gitlab
- /usr/local/docker/gitlab/logs:/var/log/gitlab
nexus docker-compose.yml
version: '3.1'
services:
nexus:
restart: always
image: sonatype/nexus3
container_name: nexus
ports:
- 8081:8081
volumes:
- /usr/local/docker/nexus/data:/nexus-data
register docker-compose.yml
version: '3.1'
services:
registry:
image: registry
restart: always
container_name: registry
ports:
- 5000:5000
volumes:
- /usr/local/docker/registry/data:/var/lib/registry
#配置webUI
frontend:
image: konradkleine/docker-registry-frontend:v2
ports:
- 8080:80
volumes:
- ./certs/frontend.crt:/etc/apache2/server.crt:ro
- ./certs/frontend.key:/etc/apache2/server.key:ro
environment:
- ENV_DOCKER_REGISTRY_HOST=192.168.85.132
- ENV_DOCKER_REGISTRY_PORT=5000
添加权限
chmod 777 /usr/local/docker/nexus/data
配置register 客户端
root@ubuntu:/etc/docker# vim daemon.json
{
"registry-mirrors": [
"https://registry.docker-cn.com"
],
"insecure-registries": [
"192.168.85.132:5000"
]
}
#重启docker服务
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
#检查配置
root@ubuntu:/etc/docker# docker info
-------------------------------
Insecure Registries:
192.168.85.132:5000
127.0.0.0/8
-------------------------------
上传本机镜像到register
标记本地镜像
root@ubuntu:/etc/docker# docker tag tomcat 192.168.85.132:5000/tomcat
push 192.168.85.132:5000/tomcat
root@ubuntu:/etc/docker# docker push 192.168.85.132:5000/tomcat
查看全部镜像
http://192.168.85.132:5000/v2/_catalog
http://192.168.85.132:5000/v2/tomcat/tags/list