一、基础用法
1.安装
传统安装模式需要在外网拉取资源,速度极慢。
故采用一键安装脚本,以下指令二选一即可。
curl -sSL https://get.daocloud.io/docker | sh
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
复制代码
更换阿里云镜像源。
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://otv9pb9m.mirror.aliyuncs.com"]
}
EOF
复制代码
#生效镜像源
systemctl daemon-reload
#重启docker
systemctl restart docker
#设置开启自启动
systemctl enable docker
复制代码
docker进程的启动、停止、重启。
systemctl start/stop/restart docker
复制代码
2.镜像
有时候组件和镜像名不完全一致,如nacos的镜像是nacos/nacos-server。
可以通过以下指令搜索一下镜像全名,或在dockerhub上搜索镜像名。
docker search ubuntu
复制代码
拉取指定镜像,不带版本号的默认是latest。
docker pull ubuntu
复制代码
查看镜像列表,附加-q则只返回镜像ID。
docker images
复制代码
删除镜像,一般带上-f强制删除,空格镜像名可连续删除。
docker rmi -f ubuntu
#批量删除
docker rmi -f $(docker image -q)
复制代码
3.容器
运行容器
启动容器常用指令,可按需挑选参数。
docker run
--detach=true #后台启动,缩写“-d”
--name=mytest #给容器备注名
--restart=always #容器若意外停止会自动重启
--privileged=true #以root权限启动容器
--user=root #以root用户名启动容器
--publish=80:80 #内外端口映射(外:内),缩写“-p”
--publish-all=true #所有端口随机暴露,缩写“-P”
--volume=/home:/home #内外文件映射(外:内),缩写“-v”
--env=MYSQL_ROOT_PASSWORD=mima #设置环境变量,缩写“-e”
--workdir=/home/ceshi #指定工作路径,缩写“-w”
--cpus=0.2 #限制CPU最大使用率,20%
--memory=400M #限制内存最大占用率,400M
--link=test #与某容器单向连接,可ping通该容器名(将废弃)
--network=mynet #加入网络环境,内部可互相ping通容器名
--rm #容器退出时自动清理容器内部的文件系统
ubuntu
复制代码
每次运行会生成一个容器,一个镜像可以对应多个容器。
默认会在生成时进入容器,并执行/bin/bash指令。
–privileged和–user=root的区别,user只是命名了用户,但并不是获得全部root权限。
可以在容器内用mount /dev/vdb3 /mnt/验证用户权限。
操作容器
#启动/停止/重启容器
docker start/stop/restart mytest
复制代码
在宿主机exec进入容器,容器内exit退出。通过该指令进入,退出时不会停止容器。
docker exec -it mytest bash
复制代码
删除容器,若容器运行中会报错,-f强制删除运行中的容器。
docker rm -f mytest
复制代码
容器的导入导出,便于容器转移,不常用。
#将容器导出为tar文件
docker export mytest > my.tar
#将tar文件导入为镜像
cat my.tar|docker import - my:1
复制代码
将容器打包成镜像,便于推送到仓库。
docker commit -m=”备注” -a=”作者” mytest my:v2
复制代码
查看容器
查看容器列表,默认只显示运行中,-a包括停止的,-q只返回容器ID。
docker ps -a
复制代码
查看所有运行中的容器的CPU、内存、硬盘、网络占用情况。
docker stats
复制代码
查看容器的详细配置信息,包括端口映射、硬盘挂载、容器IP、启动指令等。
docker inspect mytest
复制代码
查看容器内进程,相当于进入容器后执行ps -ef | grep xxx。
docker top mytest
复制代码
查看容器内输出日志,容器意外停止后,无法进入停止的容器,通过这个方式排查。
-t显示时间戳,-f输出容器内部的标准输出,–tail=n倒数后n行。
docker logs -tf --tail=3 mytest
复制代码
修改配置
容器创建初期未指定映射端口,之后需要映射端口,删除容器重新运行的方法很低效。
每个容器对应一个hash值,该路径是容器的默认存储路径,找到文件夹下的配置文件进行修改。
vim /var/lib/docker/containers/[hash_of_the_container]/hostconfig.json
复制代码
其中这一项是关于端口映射的,如果之前没有填写,那么这一项即为空值
"PortBindings":{}
#修改为
"PortBindings":{"8080/tcp":["HostIp":"","HostPort":"8080"]}
复制代码
8080/tcp对应的是容器内部的8080端口,HostPort对应的是映射到宿主机的端口8080。
按需修改端口,然后重启docker服务,再启动容器服务即可。
二、高级配置
1.网络环境
通常容器创建后,会依次分配容器的内网IP,172.17.xx.xx网段,若容器之间需要互相通信,无法提前预知互相的内网地址,就需要先部署再修改配置参数,会很繁琐。
而使用了link和network将容器之间连接,就可以只通过容器名找到该容器。
涉及的参数是link与network,建议使用network,link会在新版本逐渐淘汰。
#创建2个容器
docker run -d --name=n1 nginx
docker run -d --name=n2 --link=n1 nginx
复制代码
上述指令中,使用link将n2容器连接到了n1容器,单向联通。
分别进入容器,安装ping依赖,并互相ping对方的容器名。
可以看到从n2容器内可以ping n1成功,反之则不行。
#查看当前的docker网络
docker network ls
#返回值
NETWORK ID NAME DRIVER SCOPE
89538c2d586d bridge bridge local
464818f23b8c host host local
4c362ec21779 none null local
复制代码
Docker在默认情况下,分别会建立一个bridge、一个host和一个none的网络。
#创建自定义网络环境
docker network create bridge mynet
#创建容器n3
docker run -d --name=n3 --network=mynet nginx
复制代码
此时创建了容器n3,并将它加入到了之前创建的网络环境中。
使用下述查看指令可以看到,容器指向了该网络,网络也提示了它包含哪些容器
docker inspect n3
docker inspect mynet
复制代码
把刚才创建的2个容器也加入到该网络。
于是3个容器可以互相通过容器名ping通。
docker network connect mynet n1
docker network connect mynet n2
复制代码
2.Dockerfile
在常规操作中,需要先启动一个空容器,再进入容器进行一些初始化操作,如安装依赖等。
而Dockerfile 是一个用来构建镜像的文本文件,可以进行定制化开发,在构建镜像时将所有操作一并完成。
原则上,构建后的镜像应该满足直接run启动的条件,无需其他部署操作。
文件名可以自行设置,构建的时候指明运行哪个文件即可。
#镜像源,若不存在,则构建
FROM image:1.0
#备注上构建人,名字+邮箱(可选)
MAINTAINER name<email>
#环境变量,视各种镜像具体情况而定
ENV MODE=standalone
#将单文件或全部文件复制到容器内的路径下
ADD . /usr/local/tomcat/webapps/A.py
#容器部署后的工作路径
WORKDIR /home/ceshi/
#构建指令,将会在构建镜像的时候执行
RUN python -m pip install --upgrade pip
#暴漏端口给容器外
EXPOSE 9000
#部署容器时候执行
CMD python manage.py runserver 0.0.0.0:8000
复制代码
其中,每一个RUN都会生成一层镜像。
完成编辑后,指定目标镜像名和文件路径进行构建,注意后面有个点,意思是在当前路径下。
# -t给自定义打包的镜像命名,-f输入刚才编辑的dockerfile文件名
docker build -t myubuntu:1.0 -f df .
复制代码
3.Compose
Dockerfile实现了单容器的一键部署,若需要同时部署多个容器,按常规操作依然很麻烦。
于是需要用到docker-compose,在如下yaml文件中填写各容器的配置参数,docker会依次进行部署。
Linux系统中docker没有docker-compose功能,需要先进行安装。
#下载安装包,若需下载指定版本,修改其中的1.29.0
curl -L "https://github.com/docker/compose/releases/download/1.29.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
#查看docker-compose版本,正确返回版本说明安装成功
docker-compose --version
复制代码
version: '3'
services:
mysql:
#build和image二选一
build:
context: ./dir
dockerfile: DF
args:
buildno: 1 #替换dockerfile中的参数
image: mysql
restart: always
container_name: mysql #部署的容器名字
ports:
- 3306:3306
environment:
MYSQL_ROOT_PASSWORD: mima
volumes:
- /root/ceshi:/root/ceshi
command: python a.py
depends_on:
- web
networks:
rmq:
aliases:
- ceshi1
networks:
rmq:
name: rmq
driver: bridge
复制代码
运行部署
docker compose up -d
复制代码
三、部署样例
一些常用组件的部署例子,注意端口映射、环境变量、路径挂载,应根据实际情况自行修改。
直接复制粘贴可能会端口冲突或路径重复。
1.MySQL
docker run -itd --name=mysql --restart=always \
-p 3306:3306 -p 33060:33060 \
-v /root/mysql:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=mima \
mysql
复制代码
2.Mongo
docker run -itd --name=mongo --restart=always \
-p 27017:27017 \
-v /root/mongo:/data/db \
-e MONGO_INITDB_ROOT_USERNAME=root \
-e MONGO_INITDB_ROOT_PASSWORD=mima \
mongo \
--bind_ip_all
复制代码
3.Redis
docker run -itd --name=redis --restart=always \
-p 6379:6379 \
redis \
--requirepass "mima"
复制代码
如果需要自定义配置,可以替换redis.conf文件
docker run -itd --name=redis --restart=always \
-p 6379:6379 \
-v /home/redis.conf:/usr/local/etc/redis/redis.conf \
redis \
redis-server /usr/local/etc/redis/redis.conf \
--appendonly yes
复制代码
4.Minio
docker run -itd --name=minio --restart=always \
-p 9000:9000 \
-v /home/minio/data:/data \
-e MINIO_ACCESS_KEY=root \
-e MINIO_SECRET_KEY=mima \
minio/minio \
server /data
复制代码
5.Nacos
docker run -itd --name=nacos --restart=always \
-p 8848:8848 \
-e MODE=standalone \
nacos/nacos-server
复制代码
6.RocketMQ
在宿主机创建挂载路径
mkdir -p rocketmq/data/{namesrv/logs,namesrv/store,broker/logs,broker/store,broker/config}
复制代码
编辑配置文件
vim /root/rocketmq/data/broker/conf/broker.conf
brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
brokerIP1 = 公网IP
复制代码
docker run -itd --name=rmqnamesrv --restart=always \
-p 9876:9876 \
-v /root/rocketmq/data/namesrv/logs:/root/logs \
-v /root/rocketmq/data/namesrv/store:/root/store \
-e MAX_POSSIBLE_HEAP=100000000 \
rocketmqinc/rocketmq:4.4.0 \
sh mqnamesrv
docker run -itd --name=rmqbroker --restart=always \
-p 10911:10911 -p 10909:10909 \
-v /root/rocketmq/data/broker/logs:/root/logs \
-v /root/rocketmq/data/broker/store:/root/store \
-v /root/rocketmq/data/broker/conf/broker.conf:/opt/rocketmq-4.4.0/conf/broker.conf \
-e NAMESRV_ADDR=namesrv:9876 \
-e MAX_POSSIBLE_HEAP=200000000 \
--link=rmqnamesrv:namesrv \
rocketmqinc/rocketmq:4.4.0 \
sh mqbroker -c /opt/rocketmq-4.4.0/conf/broker.conf
docker run -itd --name=rmqconsole --restart=always \
-p 6080:8080 \
--link rmqnamesrv:namesrv \
-e "JAVA_OPTS=-Drocketmq.namesrv.addr=namesrv:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false" \
styletang/rocketmq-console-ng
复制代码
7.Tomcat
docker run -itd --name=tomcat --restart=always \
-p 8080:8080 \
-v /home/tomcat:/usr/local/tomcat/webapps \
tomcat
复制代码
8.Nginx
docker run -itd --name=nginx --restart=always \
-p 80:80 \
-v /root/nginx:/etc/nginx/conf.d \
nginx
复制代码
在挂载盘路径下新建default.conf文件,监听80端口,进行端口映射
vim /root/nginx/default.conf
server {
listen 80;
server_name www.xxx.com;
location / {
proxy_pass http://127.0.0.0:8080;#公网IP地址
}
}
复制代码
9.Gitlab
docker run -itd --name=gitlab --restart=always \
--privileged=true \
-p 8929:8929 -p 2289:2289 \
-v /root/gitlab/etc:/etc/gitlab \
-v /root/gitlab/log:/var/log/gitlab \
-v /root/gitlab/opt:/var/opt/gitlab \
gitlab/gitlab-ce
复制代码
进入容器修改配置
vi /etc/gitlab/gitlab.rb
# gitlab访问地址,可以写域名。如果端口不写的话默认为80端口
external_url 'http://120.52.92.199:8929'
# ssh主机ip
gitlab_rails['gitlab_ssh_host'] = '120.52.92.199'
# ssh连接端口
gitlab_rails['gitlab_shell_ssh_port'] = 2289
复制代码
#修改后的配置生效
gitlab-ctl reconfigure
#重启gitlab
gitlab-ctl restart
复制代码
10.Rancher
docker run -itd --name=rancher --restart=always \
--privileged=true \
-p 7272:443 \
-v /root/rancher:/var/lib/rancher \
rancher/rancher
复制代码
登录网址,注意是https,https://127.0.0.1:7272
11.Jenkins
docker run -u root -itd --name=jenkins --restart=always \
-p 8080:8080 -p 50000:50000 \
-v /home/jenkins-data:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
jenkinsci/blueocean
#查看admin用户初始密码
cat jenkins-data/secrets/initialAdminPassword
复制代码
替换下载源
Jenkins->Manage Jenkins->Manage Plugins->Advanced->Update Site
mirrors.tuna.tsinghua.edu.cn/jenkins/upd…
12.PostgreSQL
docker run -itd --name=postgres --restart=always \
-p 5432:5432 \
-v /root/postgres:/var/lib/postgresql/data \
-e PGDATA=/var/lib/postgresql/data/pgdata \
-e POSTGRES_PASSWORD=mima \
postgres
复制代码
13.SonarQube
在默认情况下,容器运行会报错:ERROR: [1] bootstrap checks failed [1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
需要修改句柄数和最大连接数。
sysctl -w vm.max_map_count=262144
sysctl -w fs.file-max=65536
ulimit -n 65536
ulimit -u 4096
复制代码
运行容器
docker run -itd --name=sonarqube --restart=always \
-p 9000:9000 \
-v /root/sonarqube/data:/opt/sonarqube/data \
-v /root/sonarqube/extensions:/opt/sonarqube/extensions \
-v /root/sonarqube/logs:/opt/sonarqube/logs \
#可选,将sonarqube数据存于其他数据库,默认为嵌入式H2数据库
-e SONAR_JDBC_URL=jdbc:postgresql://0.0.0.0:0000/sonar \
-e SONAR_JDBC_USERNAME=sonar \
-e SONAR_JDBC_PASSWORD=mima \
sonarqube
复制代码
14.Neo4j
docker run -itd --name=neo4j --restart=always \
-p 7474:7474 \
-p 7687:7687 \
-volume /home/neo4j/data:/data \
neo4j
复制代码