docker简单上手

介绍

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。(相当于虚拟机)

Docker属于对Linux容器技术的一种封装,它提供了简单易用的容器使用接口,是目前最流行的 Linux 容器解决方案。Docker将应用程序与该程序的依赖打包在一个文件里面,运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了Docker就再也不用担心环境问题了

Docker中文社区

Docker官网

安装

以Cent OS系统为例, Ubuntu和Mac OS可以点这里

首先要确认Linux系统是64位的, 目前还不支持32位的系统;Cent OS 7确保内核版本3.10+, CentOS确保内核版本2.6+

1
uname -r

安装 使用包管理工具yum

1
yum -y install docker-io

开启/关闭docker服务

1
2
systemctl start docker
systemctl stop docker

查看Docker版本

1
2
docker --version
docker version

查看帮助

1
2
3
docker --help
docker pull --help
总是可以在任何时候使用--help

下载镜像文件可以使用docker search 检索镜像文件

1
2
3
docker pull xxx
如:
docker pull redis

对于部分文件可能下载下载非常慢,可以配置镜像curl -sSL http://oyh1cogl9.bkt.clouddn.com/setmirror.sh | sh -s <镜像加速地址>

镜像加速地址

1
2
3
"https://reg-mirror.qiniu.com"
"http://hub-mirror.c.163.com",
"https://registry.docker-cn.com"

也可以直接到/etc/docker/daemon.json写入配值

1
2
3
4
5
6
{
"registry-mirrors": [
"http://hub-mirror.c.163.com",
"https://registry.docker-cn.com"
]
}

查看镜像文件

1
docker images

查看已运行的容器

1
docker ps

查看所有的容器

1
docker container ls -a

删除容器

1
2
3
docker rm <container-name>
docker rm -f <container-name> -- 强删(删除正在运行中的容器)
docker rmi <container-name> 删除容器的镜像文件

删除所有容器

1
docker container prune

停止容器

1
2
docker stop <container-name>
docker stop <container-id>

强行停止

1
docker container kill <container-id>

使用

安装MySQL

下载镜像文件

1
2
docker pull mysql:5.7
# 若不输入版本, 默认下最新版本latest

创建容器

1
2
3
4
5
docker run -d -p 3306:3306 --name mysql57 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7 
# -d表示容器后台运行 -p为宿主机对容器的端口
# --name指定容器名(用于后续访问)
# -e指定mysql的root用户
# 最后是镜像文件名

使用docker run命令,如果没有镜像文件,会直接下载再进行搭建服务

数据卷映射 将数据映射到指定的文件夹中

实际开发中或应用中, 我们可以随时删除一个容器, 但是应该将数据库类的容器中数据保存起来

1
2
3
4
5
6
7
8
9
10
11
12
13
14
docker run -d -p 3306:3306 -v /root/mysql/conf:/etc/mysql/mysql.conf.d -v /root/mysql/data:/var/lib/mysql --name mysql57 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
# -v 是将docker指定的文件夹映射到本地文件夹

# 配置mysqld.cnf文件
[mysqld]
pid-file=/var/run/mysqld/mysqld.pid
socket=/var/run/mysqld/mysqld.sock
datadir=/var/lib/mysql
log-error=/var/log/mysql/error.log
server-id=1
log-bin=/var/log/mysql/mysql-bin.log
expire_logs_days=30
max_binlog_size=256M
symbolic-links=0

进入容器

当我们创建好容器,此时若想连接数据库,首先需要先进入容器

1
2
# mysql57是mysql对应的容器名
docker exec -it mysql57 /bin/bash

然后通过mysql -uroot -p的命令连接容器中的数据库

白名单

在大量同一公网IP用户访问阿里云服务会导致阿里云判断服务器异常,会隔断所有部署在上面服务,通过个人头像 -> 安全管控 ->IP白名单 ->添加,添加的IP来源为公网IP

安装Redis

下载镜像文件

1
docker pull redis

创建容器

1
2
3
4
docker run -d -p 6379:6379 --name redis-master redis:latest redis-server [--requirepass 123456]
[--port 6379]
# --requirepass 指定redis密码
# --port修改容器的端口, 后面修改后, -p 参数也要改变

奴隶容器

1
2
3
4
5
6
7
8
9
10
11
12
13
docker run -d -p 6380:6379 --name redis-slave-1 --link redis-master:redis-master redis:latest redis-server --replicaof redis-master 6379
[--slaveof redis-master 6379 --masterauth 123456]
# 奴隶是不需要给端口, 主人会将自己传给奴隶
# --link 容器的ip地址可能因为容器重启发生变化导致无法连接主机,因此给主人容器取别名,而不是ip地址(取别名取相同值)
# redis:latest 指定镜像名, 最新的redis镜像
# --slaveof 指定主人容器名 端口号
# --replicaof 指定使用别名而不是地址
# --masterauth 指定主人容器redis的密码
# redis-server 指定服务器的命令


docker run -d --name redis-slave-1 redis:lastest redis-server --slaveof 127.17.0.2 6379
# /etc/hosts 当前主机上的网络地址

使用

当redis服务配置完成后,可以根据其对外暴露的端口进行访问

1
redis-cli -p 6380

进入容器

1
2
3
4
5
6
# 以命令终端的形式进入redis-master容器
docker exec -it redis-master /bin/bash
# 进入客户端
redis-cli
# 查看奴隶
info replication

安装GitLab

由于GitLab会使用SSH协议,即使用22端口,因此如果使用阿里云(连接服务器需要22端口),就

需要修改端口,进入文件

1
vim /etc/ssh/sshd_config

修改

1
2
#Port 22
Port 220

重启sshd服务

1
systemctl restart sshd

基于gitlab/gitlab-ce 创建镜像容器,并暴露22和80端口

1
docker run -d -p 80:80 -p 22:22 --name gitlab -v /root/gitlab/config:/etc/gitlab -v /root/gitlab/logs:/var/log/gitlab -v /root/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce

gitlab/gitlab-ce是镜像文件名 可以使用docker pull gitlab/git/gitlab-ce进行下载

构建镜像

commit方式

假设现有使用Docker配置好一个服务,以MySQL为例

1
2
3
4
docker ps -a

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
87a1144796bb mysql:5.7 "docker-entrypoint..." 2 hours ago Up 2 hours 0.0.0.0:3306->3306/tcp, 33060/tcp mysql57

使用docker commit指定容器id来构建镜像

1
docker commit 87a1144796bb rzlong/rz_mysql

查看这个镜像文件

1
2
3
4
docker images

REPOSITORY TAG IMAGE ID CREATED SIZE
rzlong/rz_mysql latest 4fb387f72318 9 minutes ago 372 MB

build+Dockerfile

  • 在一个空文件夹下创建一个Dockerfile文件
1
2
touch Dockerfile
vim Dockerfile
  • 编辑文件
1
2
3
4
5
6
# version: 0.0.1
FROM ubuntu:14.04
MAINTAINER rzlong "rzlongs@126.com"
RUN apt-get update && apt-get install -y nginx
RUN echo 'hello, world!' > /usr/share/nginx/html/index.html
EXPOSE 80
  • 对于编辑好的Dockerfile文件,使用build
1
2
3
4
5
6
7
docker build -t="rzlong/rz_server:0.1" .
# . 表示当前文件夹下的文件
# -t 后面接镜像名和版本(注意后面一个小数点,表示当前文件夹下)


docker build -t="rzlong/rz_server:0.1" -f /root/Dockerfile
# -f 指定Dockerfile文件路径 ??
-------------end-------------
0%