@khan-lau
2020-09-22T11:39:55.000000Z
字数 11805
阅读 4677
Docker
[root@xxxx tools]# uname -r
3.10.0-123.el7.x86_64
[root@xxxx tools]# cat /etc/centos-release
CentOS Linux release 7.0.1406 (Core)
[root@xxxx tools]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-lv_root 37G 1.8G 35G 5% /
devtmpfs 7.8G 0 7.8G 0% /dev
tmpfs 7.7G 0 7.7G 0% /dev/shm
tmpfs 7.7G 17M 7.7G 1% /run
tmpfs 7.7G 0 7.7G 0% /sys/fs/cgroup
/dev/xvde 985G 517M 934G 1% /data
/dev/xvda1 497M 106M 392M 22% /boot
tmpfs 1.6G 0 1.6G 0% /run/user/0
可以看到系统盘分了40G, 然后外挂了一个1T的数据盘, 典型的cloud环境.
应对策略, 数据和外挂应用都得安装在数据盘上.
给home做个软链, 挂到data盘上
rm -rf /home
mkdir /data/home -p
ln -s /data/home /home
[root@xxxx tools]# vim /etc/resolv.conf
[root@xxxx tools]# cat /etc/resolv.conf
nameserver 114.114.114.114
nameserver 202.96.128.86
nameserver 202.96.128.166
nameserver 8.8.8.8
nameserver 8.8.4.4
yum makecache
yum install -y --downloaddir=/data/tools/vim vim
yum install -y --downloaddir=/data/tools/wget wget
这俩软件比较小, 可以从官方源下载, 下载目录指定到data盘.
网易的源比较稳定, 速度也快建议使用.
cd /data/tools
wget http://mirrors.163.com/.help/CentOS7-Base-163.repo --使用网易的source
cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
cp /data/tools/CentOS7-Base-163.repo /etc/yum.repos.d/CentOS-Base.repo
yum makecache --刷新缓存, 使其生效 [option]
yum install -y --downloaddir=/data/tools/clang clang
yum install -y --downloaddir=/data/tools/pyton python
这俩环境是我自己需要的与本文关系不大, 大家可以酌情下载
yum install -y --downloaddir=/data/tools/docker docker-io
如果你们环境与我一样, 会发现最后有几行错误信息
Transaction check error:
file /usr/lib/systemd/system/blk-availability.service from install of device-mapper-7:1.02.107-5.el7_2.1.x86_64 conflicts with file from package lvm2-7:2.02.105-14.el7.x86_64
file /usr/sbin/blkdeactivate from install of device-mapper-7:1.02.107-5.el7_2.1.x86_64 conflicts with file from package lvm2-7:2.02.105-14.el7.x86_64
file /usr/share/man/man8/blkdeactivate.8.gz from install of device-mapper-7:1.02.107-5.el7_2.1.x86_64 conflicts with file from package lvm2-7:2.02.105-14.el7.x86_64
根据错误提示, 可以证实为docker的环境与包lvm2-7:2.02.105-14.el7.x86_64依赖冲突, 如果依赖环境检测失败, 不会安装任何内容
简单粗暴的解决办法, 删掉lvm2-7, 装上device-mapper-libs, 再尝试重新装docker
yum remove lvm2-7:2.02.105-14.el7.x86_64
yum upgrade -y --downloaddir=/data/tools/docker device-mapper-libs
yum install -y --downloaddir=/data/tools/docker docker-io
安装结果
已安装:
docker.x86_64 0:1.9.1-25.el7.centos
作为依赖被安装:
audit-libs-python.x86_64 0:2.4.1-5.el7
checkpolicy.x86_64 0:2.1.12-6.el7
docker-forward-journald.x86_64 0:1.9.1-25.el7.centos
docker-selinux.x86_64 0:1.9.1-25.el7.centos
libaio.x86_64 0:0.3.109-13.el7
libcgroup.x86_64 0:0.41-8.el7
libsemanage-python.x86_64 0:2.1.10-18.el7
lvm2.x86_64 7:2.02.130-5.el7_2.1
policycoreutils-python.x86_64 0:2.2.5-20.el7
python-IPy.noarch 0:0.75-6.el7
setools-libs.x86_64 0:3.3.7-46.el7
更新完毕:
dracut.x86_64 0:033-360.el7_2
initscripts.x86_64 0:9.49.30-1.el7_2.2
作为依赖被升级:
audit.x86_64 0:2.4.1-5.el7
audit-libs.x86_64 0:2.4.1-5.el7
device-mapper-persistent-data.x86_64 0:0.5.5-1.el7
dracut-config-rescue.x86_64 0:033-360.el7_2
dracut-network.x86_64 0:033-360.el7_2
kmod.x86_64 0:20-5.el7
libgudev1.x86_64 0:219-19.el7_2.7
libsemanage.x86_64 0:2.1.10-18.el7
lvm2-libs.x86_64 7:2.02.130-5.el7_2.1
policycoreutils.x86_64 0:2.2.5-20.el7
selinux-policy.noarch 0:3.13.1-60.el7_2.3
selinux-policy-targeted.noarch 0:3.13.1-60.el7_2.3
systemd.x86_64 0:219-19.el7_2.7
systemd-libs.x86_64 0:219-19.el7_2.7
systemd-sysv.x86_64 0:219-19.el7_2.7
完毕!
安装完毕了, 进行一下简单的测试
[root@xxxx tools]# service docker status
Redirecting to /bin/systemctl status docker.service
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
Active: inactive (dead)
Docs: http://docs.docker.com
[root@YDYWZX tools]# docker info
Cannot connect to the Docker daemon. Is the docker daemon running on this host?
发现服务没启动, 先不急, 准备一下, 把docker的工作目录指向有1T存储空间的data盘
mkdir -p /data/docker
rm -rf /var/lib/docker
ln -s /data/docker /var/lib/docker
配置docker
[root@xxx gitlab]# vim /etc/sysconfig/docker-storage
DOCKER_STORAGE_OPTIONS="--storage-opt dm.no_warn_on_loop_devices=true"
启动docker服务, 并设置为开机启动
[root@xxxx tools]# service docker start
Redirecting to /bin/systemctl start docker.service
[root@xxxx tools]# chkconfig docker on
注意:正在将请求转发到“systemctl enable docker.service”。
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
如果出现报错信息:
Error starting daemon: SELinux is not supported with the overlay2 graph driver on this kernel. Either boot into a newer kernel or disable selinux in docker (--selinux-enabled=false)
意思是说, 此linux的内核中的SELinux不支持 overlay2 graph driver ,解决方法有两个,要么启动一个新内核,要么就在docker里禁用selinux,--selinux-enabled=false
重新编辑docker配置文件:
vi /etc/sysconfig/docker
将
# /etc/sysconfig/docker
# Modify these options if you want to change the way the docker daemon runs
OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false'
if [ -z "${DOCKER_CERT_PATH}" ]; then
DOCKER_CERT_PATH=/etc/docker
fi
修改为
# /etc/sysconfig/docker
# Modify these options if you want to change the way the docker daemon runs
OPTIONS='--selinux-enabled=false --log-driver=journald --signature-verification=false'
if [ -z "${DOCKER_CERT_PATH}" ]; then
DOCKER_CERT_PATH=/etc/docker
fi
查看docker环境信息
[root@xxx lib]# docker info
Containers: 0
Images: 0
Server Version: 1.9.1
Storage Driver: devicemapper
Pool Name: docker-202:64-51118083-pool
Pool Blocksize: 65.54 kB
Base Device Size: 107.4 GB
Backing Filesystem: xfs
Data file: /dev/loop0
Metadata file: /dev/loop1
Data Space Used: 53.67 MB
Data Space Total: 107.4 GB
Data Space Available: 107.3 GB
Metadata Space Used: 606.2 kB
Metadata Space Total: 2.147 GB
Metadata Space Available: 2.147 GB
Udev Sync Supported: true
Deferred Removal Enabled: false
Deferred Deletion Enabled: false
Deferred Deleted Device Count: 0
Data loop file: /data/docker/devicemapper/devicemapper/data
Metadata loop file: /data/docker/devicemapper/devicemapper/metadata
Library Version: 1.02.107-RHEL7 (2015-12-01)
Execution Driver: native-0.2
Logging Driver: json-file
Kernel Version: 3.10.0-123.el7.x86_64
Operating System: CentOS Linux 7 (Core)
CPUs: 4
Total Memory: 15 GiB
Name: YDYWZX
ID: HMFB:MZJR:CDM3:Z5Y5:WQUH:CFT3:5BOU:N7K6:XN43:WZYW:XIXY:6KJ6
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled
查看docker版本
[root@xxx lib]# docker version
Client:
Version: 1.9.1
API version: 1.21
Package version: docker-1.9.1-25.el7.centos.x86_64
Go version: go1.4.2
Git commit: 78ee77d/1.9.1
Built:
OS/Arch: linux/amd64
Server:
Version: 1.9.1
API version: 1.21
Package version: docker-1.9.1-25.el7.centos.x86_64
Go version: go1.4.2
Git commit: 78ee77d/1.9.1
Built:
OS/Arch: linux/amd64
gitlab依赖俩个服务, redis和postgresql
现在做个小结, 宿主机是CentOS7, 3.10内核, 装了docker环境.
现在需要安装三个镜像, 组成gitlab服务. redis postgresql gitlab
docker pull sameersbn/redis
docker pull sameersbn/postgresql
docker pull sameersbn/gitlab
gitlab镜像比较大, 建议该吃饭吃饭该睡觉睡觉.
docker省掉的不就是安装么. 你可以认为下载好镜像的同时就已经安装好了
mkdir -p /data/program/srv/docker/gitlab/postgresql
chcon -Rt svirt_sandbox_file_t /data/program/srv/docker/gitlab/postgresql
docker run --name gitlab-postgresql -d \
-e 'DB_NAME=gitlabhq_production' \
-e 'DB_USER=gitlab' -e 'DB_PASS=password' \
-e 'DB_EXTENSION=pg_trgm,btree_gist' \
-v /data/program/srv/docker/gitlab/postgresql:/var/lib/postgresql \
sameersbn/postgresql
chcon 主要是考虑 selinux 开启的情况,这个大家看情况执行。
docker run 命令中中的 -v 是为了将宿主服务器的目录挂载到 docker 内,为了持久化数据,下面的其他容器也一样
sudo mkdir -p /data/program/srv/docker/gitlab/redis
sudo chcon -Rt svirt_sandbox_file_t /data/program/srv/docker/gitlab/redis
docker run --name gitlab-redis -tid \
-v /data/program/srv/docker/gitlab/redis:/var/lib/redis \
sameersbn/redis
sudo mkdir -p /data/program/srv/docker/gitlab/gitlab
sudo chcon -Rt svirt_sandbox_file_t /data/program/srv/docker/gitlab/gitlab
docker run --name gitlab -tid \
--link gitlab-postgresql:postgresql --link gitlab-redis:redisio \
-p 1083:22 -p 8088:80 \
-e 'GITLAB_HOST=114.113.112.83' \
-e 'GITLAB_PORT=8088' -e 'GITLAB_SSH_PORT=1083' \
-e 'GITLAB_SECRETS_DB_KEY_BASE=gitlab' \
-e 'GITLAB_BACKUPS=daily' \
-e 'GITLAB_BACKUP_TIME=20:00' \
-e 'GITLAB_TIMEZONE=Beijing' \
-e 'GITLAB_EMAIL=git@example.cn' -e 'GITLAB_EMAIL_DISPLAY_NAME=Git' -e 'GITLAB_EMAIL_REPLY_TO=noreply@example.cn' \
-e 'NGINX_MAX_UPLOAD_SIZE=60m' \
-e 'GITLAB_GRAVATAR_ENABLED=false' \
-e 'SMTP_DOMAIN=smtp.example.com' -e 'SMTP_HOST=smtp.example.com' -e 'SMTP_PORT=25' \
-e 'SMTP_USER=git@example.cn' -e 'SMTP_PASS=example' \
-e 'LDAP_ENABLED=true' \
-e 'LDAP_HOST=218.104.82.226' -e 'LDAP_PORT=389' -e 'LDAP_METHOD=plain' \
-e 'LDAP_UID=sAMAccountName' \
-e 'LDAP_BIND_DN=cn=ldapuser,cn=users,dc=example,dc=com' \
-e 'LDAP_PASS=example' \
-e 'LDAP_ACTIVE_DIRECTORY=true' \
-e 'LDAP_BASE=cn=users,dc=example,dc=com' \
-e 'LDAP_BLOCK_AUTO_CREATED_USERS=false' \
-v /data/program/srv/docker/gitlab/gitlab:/home/git/data \
sameersbn/gitlab
上面的 GitLab 的 docker 命令参数要多一点,主要是其中配置了邮箱和 LDAP 服务器。大家可以参照官方文档自行增删配置。
例如:
docker run --name gitlab -tid \
--link gitlab-postgresql:postgresql --link gitlab-redis:redisio \
-p 1083:22 -p 8088:80 \
-e 'GITLAB_HOST=114.113.112.83' \
-e 'GITLAB_PORT=8088' -e 'GITLAB_SSH_PORT=1083' \
-e 'GITLAB_SECRETS_DB_KEY_BASE=long-and-random-alpha-numeric-string' \
-e 'GITLAB_SECRETS_SECRET_KEY_BASE=long-and-random-alpha-numeric-string' \
-e 'GITLAB_SECRETS_OTP_KEY_BASE=long-and-random-alpha-numeric-string' \
-e 'GITLAB_BACKUPS=daily' \
-e 'GITLAB_BACKUP_TIME=20:00' \
-e 'GITLAB_TIMEZONE=Beijing' \
-e 'GITLAB_EMAIL=git@example.cn' -e 'GITLAB_EMAIL_DISPLAY_NAME=Git' -e 'GITLAB_EMAIL_REPLY_TO=noreply@example.cn' \
-e 'NGINX_MAX_UPLOAD_SIZE=60m' \
-e 'GITLAB_GRAVATAR_ENABLED=false' \
-e 'GITLAB_EMAIL_ENABLED=false' \
-e 'GITLAB_INCOMING_EMAIL_ENABLED=false' \
-e 'GITLAB_SIGNUP=false' \
-v /data/program/srv/docker/gitlab/gitlab:/home/git/data \
sameersbn/gitlab
docker run --name gitlab -d \
--link gitlab-postgresql:postgresql --link gitlab-redis:redisio \
-p 1022:22 -p 8088:80 \
--env 'GITLAB_PORT=8088' --env 'GITLAB_SSH_PORT=1022' \
--env 'GITLAB_SECRETS_DB_KEY_BASE=long-and-random-alpha-numeric-string' \
--env 'GITLAB_SECRETS_SECRET_KEY_BASE=long-and-random-alpha-numeric-string' \
--env 'GITLAB_SECRETS_OTP_KEY_BASE=long-and-random-alpha-numeric-string' \
--volume /data/program/srv/docker/gitlab/gitlab:/home/git/data \
sameersbn/gitlab
因为这台运行 docker 的宿主服务器就是一台专门为 GitLab 申请的虚拟机,所以后面就没有配置独立IP。
直接在命令中通过 -p 1083:22 -p 8088:80 指定了服务器的端口映射。
端口映射规则, IP:host_port:container_port 或 -p IP::port 来指定允许访问容器的主机上的 IP、接口等,以制定更严格的规则。
如果希望永久绑定到某个固定的 IP 地址,可以在 Docker 配置文件 /etc/default/docker 中指定 DOCKER_OPTS="--ip=IP_ADDRESS",之后重启 Docker 服务即可生效。
GITLAB_PORT&GITLAB_SSH_PORT gitlab在公网的服务端口, 配置正确以便于生成正确的url
这里面有一点比较特殊,GitLab 的默认时间是 UTC 时间,所以通过 -e 'GITLAB_TIMEZONE=Beijing' 指定了 +8 时区。
如果你使用自带的 backup 配置的话也要注意,默认的备份时间 04:00 对应到我们这边实际上是中午 12:00 了。所以我通过 -e 'GITLAB_BACKUP_TIME=20:00'指定了备份时间为北京时间的 04:00。当然,这个备份时间大家自己看着调了。
最后的 GitLab 容器通过 --link gitlab-postgresql:postgresql --link gitlab-redis:redisio link 到 redis 和 postgresql ,postgresql和redis成为gitlab的子容器, 所以其他两个容器的 IP 、端口和数据库的配置信息不用指定。镜像中已经做了处理。
当然,其他两个容器肯定要比 GitLab 先启动。
docker start gitlab-redis
docker start gitlab-postgresql
docker start gitlab
容器启动后等一会(初始化时间)就可以正常访问和配置了。 >账户:root >密码:5iveL!fe
docker exec 是Docker內建的命令。下面示範如何使用該命令。
$ sudo docker run -idt ubuntu
243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
243c32535da7 ubuntu:latest "/bin/bash" 18 seconds ago Up 17 seconds nostalgic
$sudo docker exec -ti nostalgic bash
root@243c32535da7:/#
关于-i、-t参数, 可以看出只用-i时,由于没有分配伪终端,看起来像pipe执行一样。但是执行结果、命令返回值都可以正确获取。 如果只使用-t参数,则可以看到一个console窗口,但是执行命令会发现由于没有获得stdin的输出,无法看到命令执行情况。 使用-it时,则和我们平常操作console界面类似。而且也不会像attach方式因为退出,导致整个容器退出。
docker attach 亦是Docker內建的命令。下面示例如何使用該命令。
$ sudo docker run -idt ubuntu
243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
243c32535da7 ubuntu:latest "/bin/bash" 18 seconds ago Up 17 seconds nostalgic
$sudo docker attach nostalgic
root@243c32535da7:/#
但是使用 attach 命令有時候並不方便。當多個窗口同時 attach 到同一個容器的時候,所有窗口都會同步顯示。當某個窗口因命令阻塞時,其他窗口也無法執行操作了。但是需要注意的是,如果从这个stdin中exit,会导致容器的停止。
查看sameersbn/gitlab容器的日志
docker logs $( docker ps -a|grep sameersbn/gitlab |awk '{print $1}' )
docker logs -f $( docker ps -a|grep sameersbn/gitlab |awk '{print $1}' )
查看sameersbn/redis容器的ip
docker inspect $( docker ps -a|grep redis |awk '{print $1}' ) |grep IPAddress
停掉sameersbn/gitlab容器
docker stop $( docker ps -a|grep sameersbn/gitlab |awk '{print $1}' )
删除sameersbn/gitlab容器
docker rm $( docker ps -a|grep sameersbn/gitlab |awk '{print $1}' )
停掉所有容器
docker stop $(docker ps -a -q)
删除所有容器
docker rm $(docker ps -a -q)
查看所有运行中得容器
docker ps
删掉名称为sameersbn/gitlab的镜像
docker rmi $( docker images|grep sameersbn/gitlab |awk '{print $3}' )
查看所有镜像
docker images