@khan-lau
2020-09-22T03:39:55.000000Z
字数 11805
阅读 5058
Docker
[root@xxxx tools]# uname -r3.10.0-123.el7.x86_64[root@xxxx tools]# cat /etc/centos-releaseCentOS 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% /devtmpfs 7.7G 0 7.7G 0% /dev/shmtmpfs 7.7G 17M 7.7G 1% /runtmpfs 7.7G 0 7.7G 0% /sys/fs/cgroup/dev/xvde 985G 517M 934G 1% /data/dev/xvda1 497M 106M 392M 22% /boottmpfs 1.6G 0 1.6G 0% /run/user/0
可以看到系统盘分了40G, 然后外挂了一个1T的数据盘, 典型的cloud环境.
应对策略, 数据和外挂应用都得安装在数据盘上.
给home做个软链, 挂到data盘上
rm -rf /homemkdir /data/home -pln -s /data/home /home
[root@xxxx tools]# vim /etc/resolv.conf[root@xxxx tools]# cat /etc/resolv.confnameserver 114.114.114.114nameserver 202.96.128.86nameserver 202.96.128.166nameserver 8.8.8.8nameserver 8.8.4.4
yum makecacheyum install -y --downloaddir=/data/tools/vim vimyum install -y --downloaddir=/data/tools/wget wget
这俩软件比较小, 可以从官方源下载, 下载目录指定到data盘.
网易的源比较稳定, 速度也快建议使用.
cd /data/toolswget http://mirrors.163.com/.help/CentOS7-Base-163.repo --使用网易的sourcecp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bakcp /data/tools/CentOS7-Base-163.repo /etc/yum.repos.d/CentOS-Base.repoyum makecache --刷新缓存, 使其生效 [option]
yum install -y --downloaddir=/data/tools/clang clangyum 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_64file /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_64file /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_64yum upgrade -y --downloaddir=/data/tools/docker device-mapper-libsyum 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.el7checkpolicy.x86_64 0:2.1.12-6.el7docker-forward-journald.x86_64 0:1.9.1-25.el7.centosdocker-selinux.x86_64 0:1.9.1-25.el7.centoslibaio.x86_64 0:0.3.109-13.el7libcgroup.x86_64 0:0.41-8.el7libsemanage-python.x86_64 0:2.1.10-18.el7lvm2.x86_64 7:2.02.130-5.el7_2.1policycoreutils-python.x86_64 0:2.2.5-20.el7python-IPy.noarch 0:0.75-6.el7setools-libs.x86_64 0:3.3.7-46.el7更新完毕:dracut.x86_64 0:033-360.el7_2initscripts.x86_64 0:9.49.30-1.el7_2.2作为依赖被升级:audit.x86_64 0:2.4.1-5.el7audit-libs.x86_64 0:2.4.1-5.el7device-mapper-persistent-data.x86_64 0:0.5.5-1.el7dracut-config-rescue.x86_64 0:033-360.el7_2dracut-network.x86_64 0:033-360.el7_2kmod.x86_64 0:20-5.el7libgudev1.x86_64 0:219-19.el7_2.7libsemanage.x86_64 0:2.1.10-18.el7lvm2-libs.x86_64 7:2.02.130-5.el7_2.1policycoreutils.x86_64 0:2.2.5-20.el7selinux-policy.noarch 0:3.13.1-60.el7_2.3selinux-policy-targeted.noarch 0:3.13.1-60.el7_2.3systemd.x86_64 0:219-19.el7_2.7systemd-libs.x86_64 0:219-19.el7_2.7systemd-sysv.x86_64 0:219-19.el7_2.7完毕!
安装完毕了, 进行一下简单的测试
[root@xxxx tools]# service docker statusRedirecting to /bin/systemctl status docker.service● docker.service - Docker Application Container EngineLoaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)Active: inactive (dead)Docs: http://docs.docker.com[root@YDYWZX tools]# docker infoCannot connect to the Docker daemon. Is the docker daemon running on this host?
发现服务没启动, 先不急, 准备一下, 把docker的工作目录指向有1T存储空间的data盘
mkdir -p /data/dockerrm -rf /var/lib/dockerln -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 startRedirecting 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 runsOPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false'if [ -z "${DOCKER_CERT_PATH}" ]; thenDOCKER_CERT_PATH=/etc/dockerfi
修改为
# /etc/sysconfig/docker# Modify these options if you want to change the way the docker daemon runsOPTIONS='--selinux-enabled=false --log-driver=journald --signature-verification=false'if [ -z "${DOCKER_CERT_PATH}" ]; thenDOCKER_CERT_PATH=/etc/dockerfi
查看docker环境信息
[root@xxx lib]# docker infoContainers: 0Images: 0Server Version: 1.9.1Storage Driver: devicemapperPool Name: docker-202:64-51118083-poolPool Blocksize: 65.54 kBBase Device Size: 107.4 GBBacking Filesystem: xfsData file: /dev/loop0Metadata file: /dev/loop1Data Space Used: 53.67 MBData Space Total: 107.4 GBData Space Available: 107.3 GBMetadata Space Used: 606.2 kBMetadata Space Total: 2.147 GBMetadata Space Available: 2.147 GBUdev Sync Supported: trueDeferred Removal Enabled: falseDeferred Deletion Enabled: falseDeferred Deleted Device Count: 0Data loop file: /data/docker/devicemapper/devicemapper/dataMetadata loop file: /data/docker/devicemapper/devicemapper/metadataLibrary Version: 1.02.107-RHEL7 (2015-12-01)Execution Driver: native-0.2Logging Driver: json-fileKernel Version: 3.10.0-123.el7.x86_64Operating System: CentOS Linux 7 (Core)CPUs: 4Total Memory: 15 GiBName: YDYWZXID: HMFB:MZJR:CDM3:Z5Y5:WQUH:CFT3:5BOU:N7K6:XN43:WZYW:XIXY:6KJ6WARNING: bridge-nf-call-iptables is disabledWARNING: bridge-nf-call-ip6tables is disabled
查看docker版本
[root@xxx lib]# docker versionClient:Version: 1.9.1API version: 1.21Package version: docker-1.9.1-25.el7.centos.x86_64Go version: go1.4.2Git commit: 78ee77d/1.9.1Built:OS/Arch: linux/amd64Server:Version: 1.9.1API version: 1.21Package version: docker-1.9.1-25.el7.centos.x86_64Go version: go1.4.2Git commit: 78ee77d/1.9.1Built:OS/Arch: linux/amd64
gitlab依赖俩个服务, redis和postgresql
现在做个小结, 宿主机是CentOS7, 3.10内核, 装了docker环境.
现在需要安装三个镜像, 组成gitlab服务. redis postgresql gitlab
docker pull sameersbn/redisdocker pull sameersbn/postgresqldocker pull sameersbn/gitlab
gitlab镜像比较大, 建议该吃饭吃饭该睡觉睡觉.
docker省掉的不就是安装么. 你可以认为下载好镜像的同时就已经安装好了
mkdir -p /data/program/srv/docker/gitlab/postgresqlchcon -Rt svirt_sandbox_file_t /data/program/srv/docker/gitlab/postgresqldocker 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/redissudo chcon -Rt svirt_sandbox_file_t /data/program/srv/docker/gitlab/redisdocker 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/gitlabsudo chcon -Rt svirt_sandbox_file_t /data/program/srv/docker/gitlab/gitlabdocker 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/gitlabdocker 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-redisdocker start gitlab-postgresqldocker start gitlab
容器启动后等一会(初始化时间)就可以正常访问和配置了。 >账户:root >密码:5iveL!fe
docker exec 是Docker內建的命令。下面示範如何使用該命令。
$ sudo docker run -idt ubuntu243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550$ sudo docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES243c32535da7 ubuntu:latest "/bin/bash" 18 seconds ago Up 17 seconds nostalgic$sudo docker exec -ti nostalgic bashroot@243c32535da7:/#
关于-i、-t参数, 可以看出只用-i时,由于没有分配伪终端,看起来像pipe执行一样。但是执行结果、命令返回值都可以正确获取。 如果只使用-t参数,则可以看到一个console窗口,但是执行命令会发现由于没有获得stdin的输出,无法看到命令执行情况。 使用-it时,则和我们平常操作console界面类似。而且也不会像attach方式因为退出,导致整个容器退出。
docker attach 亦是Docker內建的命令。下面示例如何使用該命令。
$ sudo docker run -idt ubuntu243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550$ sudo docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES243c32535da7 ubuntu:latest "/bin/bash" 18 seconds ago Up 17 seconds nostalgic$sudo docker attach nostalgicroot@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