docker学习笔记
https://yeasy.gitbooks.io/docker_practice/content/compose/
1. 安装docker
#Docker 要求 CentOS 系统的内核版本高于 3.10
uname -r #查看你当前的内核版本
#卸载旧版本
sudo yum remove docker docker-common docker-selinux docker-engine
#安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
#设置yum源
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
#查看所有仓库中所有docker版本,并选择特定版本安装
yum list docker-ce --showduplicates | sort -r
#安装docker
sudo yum install docker-ce #由于repo中默认只开启stable仓库,故这里安装的是最新稳定版17.12.0
#启动并加入开机启动
sudo systemctl start docker
sudo systemctl enable docker
#验证安装是否成功
docker version
#重启docker
systemctl restart docker
systemctl daemon-reload
为用户添加权限
1、普通用户启动docker时遇到如下错误:
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.26/build?
buildargs=%7B%7D&buildbinds=null&cachefrom=%5B%5D&cgroupparent=&cpuperiod=0&cpuquota=0&cpusetcpus=&cpusetmems=&cpushares=0&dockerfile=Dockerfile&labels=%7B%7
D&memory=0&memswap=0&networkmode=default&rm=1&shmsize=0&t=192.168.1.202%2Flibrary%2Ficp-service-interface%3Av2&ulimits=null:dial unix /var/run/docker.sock: connect:
permission denied
2、解决办法
2.1、添加docker用户组
groupadd docker
2.2、把当前用户加入docker用户组
gpasswd -a ${USER} docker #表示当前用户: $USER 改成要使用权限的用户
3、查看是否添加成功:
cat /etc/group | grep ^docker
4、重启docker
serivce docker restart
5、更新用户组
newgrp docker
6、测试docker命令是否可以使用sudo正常使用
docker ps
2. 镜像
https://www.daocloud.io/mirror#accelerator-doc
https://www.cnblogs.com/yufeng218/p/8371751.html
首先进入daoCloud 官网,点击更多,下面会有“加速器” ,点击进去后,你会看到如下页面, 分别对应了3个系统的docker 镜像设置脚本,对应执行以下就可以了。
$ docker pull hub.c.163.com/library/node:latest
$ docker images
3. Docker镜像常用命令
# 搜索镜像
docker search [OPTIONS] TERM
docker search java
# 下载镜像
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
docker pull java
# 列出镜像
docker images [OPTIONS] [REPOSITORY[:TAG]]
# 删除本地镜像
docker rmi [OPTIONS] IMAGE [IMAGE...]
docker rmi hello-world
docker rmi -f $(docker images) # 删除所有镜像
docker rmi $(docker images | grep "^<none>" | awk "{print $3}")
# 保存镜像
docker save [OPTIONS] IMAGE [IMAGE...]
docker save busybox > busybox.tar
docker save --output busybox.tar busybox
#加载镜像
docker load [OPTIONS]
docker load < busybox.tar.gz
docker load --input fedora.tar
https://www.jianshu.com/p/0f7b18aa7941
Dockerfile指令详解
https://www.imooc.com/article/39725
https://www.imooc.com/article/282348
https://www.imooc.com/article/25620
# 构建镜像
docker build [OPTIONS] PATH | URL | -
docker build -t nginx:v1 .
4. 容器常用命令
# 新建并启动一个容器
① -d选项:表示后台运行
② -P选项:随机端口映射
③ -p选项:指定端口映射,有以下四种格式。
ip:hostPort:containerPort
ip::containerPort
hostPort:containerPort
containerPort
④ –network选项:指定网络模式,该选项有以下可选参数:
–network=bridge: 默认选项,表示连接到默认的网桥。
–network=host:容器使用宿主机的网络。
–network=container:NAME_or_ID:告诉Docker让新建的容器使用已有容器的网络配置。
–network=none:不配置该容器的网络,用户可自定义网络配置。
docker run java /bin/echo 'Hello World'
docker run -d -p 91:80 nginx # -p 宿主机端口:容器端口 # 开放容器端口到宿主机端口 http://Docker宿主机IP:91/
docker run --name docker_nginx_v1 -d -p 80:80 nginx:v1
容器常用命令
docker ps -a #查看全部容器
docker ps -l
#查看日志
docker logs -f nexus
docker exec -it 480f45d /bin/bash
docker cp hello-world.war 117b230feabb:/docker_home/local/tomcat7/webapps
docker cp 文件路径 容器ID/NAME:容器路径
# 列出运行中的容器
docker ps
|Name|shorthand|Default|Description|
|--all| -a| false| 列出所有容器,包括未运行的容器,默认只展示运行的容器|
|--filter| -f | |根据条件过滤显示内容|
|--format | |通过Go语言模板文件展示镜像|
|--last|-n |-1 |显示最近创建n个容器(包含所有状态)|
|--latest| -l | false| 显示最近创建的容器(包含所有状态)|
|--no-trunc| |false |不截断输出|
|--quiet| -q| false |静默模式,只展示容器的编号|
|--size| -s| false| 显示总文件大小|
# 停止容器
docker stop [OPTIONS] CONTAINER [CONTAINER...]
docker stop 784fd3b294d7
# 强制停止容器
docker kill [OPTIONS] CONTAINER [CONTAINER...]
docker kill 784fd3b294d7
# 启动已停止的容器
docker start [OPTIONS] CONTAINER [CONTAINER...]
docker start 784fd3b294d7
# 重启容器
docker restart [OPTIONS] CONTAINER [CONTAINER...]
# 进入容器
docker attach 784fd3b294d7
# 删除容器
docker rm [OPTIONS] CONTAINER [CONTAINER...]
docker rm 784fd3b294d7
Name, shorthand Default Description
--force, -f false 通过SIGKILL信号强制删除正在运行中的容器
--link, -l false 删除容器间的网络连接
--volumes, -v false 删除与容器关联的卷
# 进入容器
docker exec -it 容器id /bin/bash
#创建数据卷
docker run --name nginx-data -v /mydir 容器id
# 查看容器构造的详情
docker inspect 容器ID
#删除数据卷
docker rm -v 容器ID
#挂载宿主机目录作为数据卷
docker run --namename-volume -v /host-dir:/container-dir 容器ID
#挂载的权限是读写权限。也可使用:ro 参数指定只读权限
docker run --name name-volume -v /host-dir:/container-dir:ro 容器ID
#创建数据卷容器
docker run --name name-volume -v /data 容器ID
docker volume create name-volume
#在其他容器中使用-volumes-from 来挂载 name-volume容器中的数据卷
docker run --name v1 --volumes-from name-volume 容器ID
https://blog.csdn.net/Kiloveyousmile/article/details/79830810
https://blog.csdn.net/henni_719/article/details/89376111
docker network create
docker network connect
docker network ls
docker network rm
docker network disconnect
docker network inspect
docker network create simple-network #桥接网络
docker network inspect simple-network
docker network create -d bridge --subnet 172.25.0.0/16 simple-network
#指定网络及ip
docker run --network=simple-network --ip=172.25.3.3 -itd --name=container3 imagename
创建一个容器,名为container5 ,并使用别名c4将其链接到container4 --network-alias app 给网络设置别名app
docker run --network=simple-network -itd --name=container5 --link container4:c4 --network-alias app imagename
#overlay 网络
docker network create -d overlay \
--subnet=192.168.0.0/16 \
--subnet=192.170.0.0/16 \
--gateway=192.168.0.100 \
--gateway=192.170.0.100 \
--ip-range=192.168.1.0/24 \
--aux-address="my-router=192.168.1.5" --aux-address="my-switch=192.168.1.6" \
--aux-address="my-printer=192.170.1.5" --aux-address="my-nas=192.170.1.6" \
my-multihost-network
docker network create -d bridge --subnet 172.25.0.0/16 my-network
#将指定容器连接到网络
docker network connect my-network container_name
docker network disconnect my-network container_name
docker network rm my-network
https://blog.csdn.net/qq_36119192/article/details/84404155
https://www.jianshu.com/p/145735b51dc5
https://blog.51cto.com/zhihao280/163849
搭建Docker Registry 2.0
# 搭建一个docker私有库服务 --restart=alwarys 标识当docker daemon启动的时候一起启动
docker run -d -p 5000:5000 --restart=always --name registry2 registry:2
# 修改镜像标签 将镜像推送到私有仓库
docker tag itmuch/microservice-discovery-eureka:0.0.1 localhost:5000/itmuch/microservice-discovery-eureka:0.0.1
docker push localhost:5000/itmuch/microservice-discovery-eureka:0.0.1
# 将镜像打了一个标签,相当于重命名一样,让名称尽可能规范
docker tag java:example chicu/java:example
docker push chicu/java:example
推送镜像到私服
# 将镜像推送到私服仓库中,需要修改镜像标签
docker tag java:my localhost:5000/java:my
docker push localhost:5000/java:my
# 获取私有仓库镜像
docker pull localhost:5000/java:my
# 查看私服镜像所有仓库
curl http://localhost:5000/v2/_catalog
# 查看仓库中镜像的所有标签列表
curl http://localhost:5000/v2/java/tags/list
Nexus管理Docker镜像
nexus 3搭建Docker私有仓库
使用Nexus管理Docker镜像
Docker的配置文件 daemon.json 详解
修改后只要reconfigure(systemctl reload docker) 就生效
{
"registry-mirrors": ["http://harbor.test.com"], #镜像加速地址
"insecure-registries": ["harbor.test.com","registry.cn-shenzhen.aliyuncs.com"], # Docker如果需要从非SSL源管理镜像,这里加上。
"max-concurrent-downloads": 10
}
# 登录私有仓库 push上传之前必须要先登录
docker login 192.168.1.101:8082
# 上传镜像之前需要先打一个tag,用于版本标记
docker tag <imageId or imageName> <nexus-hostname>:<repository-port>/<image>:<tag>
docker tag lusyoe-debian 192.168.1.2:8082/lusyoe-debian:latest
# 上传镜像
docker push 192.168.1.2:8082/lusyoe-debian:latest
# pull镜像
docker pull 192.168.1.2:8082/lusyoe-debian
# 搜索镜像
docker search 192.168.1.2:8082/lusyoe
docker管理界面
docker run -d --privileged -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v /opt/portainer:/data portainer/portainer
$ docker volume create portainer_data #会在/var/lib/docker/volumes/ 路径下创建文件夹
$ docker run -d -p 9000:9000 --name portainer --restart always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer
使用Maven插件构建Docker镜像
mvn clean package docker:build
# 推送镜像
mvn clean package -Dmaven.test.skip=true docker:build -DpushImage
# 为同一个镜像指定两个标签
mvn clean package docker:build -DpushImageTags -DdockerImageTags=latest -DdockerImageTags=another-tag
Dockerfile
FROM java:8
VOLUME /tmp
ADD microservice-discovery-eureka-0.0.1-SNAPSHOT.jar app.jar
RUN bash -c 'touch /app.jar'
EXPOSE 9000
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
http://itmuch.com/categories/Docker/page/2/
https://blog.csdn.net/u011781521/article/details/80468985
https://blog.csdn.net/u011781521/article/details/80466451