docker的安装和常用命令

docker的安装和常用命令

注:这里的安装是针对于cetnos7。

安装

老版本

安装老版本可能遇到报错:missing signature key

shell 复制代码
yum -y install docker.x86_64

新版本

shell 复制代码
# 换成阿里镜像仓库
yum-config-manager --add-repo   http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum remove docker docker-common docker-selinux docker-engine
yum -y install docker-ce
systemctl start docker

设置docker镜像,阿里云镜像源需要到官网注册后才能获取,推荐使用阿里的。若某些官方镜像用阿里的拉取不到,可以参考 DaoCloud/public-image-mirrorREADME.mdissue里的说明,获取其他镜像源。github访问不了,可以访问gitcode:public-image-mirror

镜像源配置

sh 复制代码
vi /etc/docker/daemon.json
{
  "registry-mirrors": [
    "https://dockerhub.icu",
    "https://docker.chenby.cn",
    "https://docker.1panel.live",
    "https://docker.awsl9527.cn",
    "https://docker.anyhub.us.kg",
    "https://dhub.kubesre.xyz"
  ]
}
systemctl daemon-reload
systemctl restart docker

#不配置,直接使用
docker pull docker.anyhub.us.kg/docker.io/biluoer/hadoop:3.1.3-base

常用命令

基本命令

sh 复制代码
# 镜像命令
docker pull nginx	# 拉取镜像
docker push biluoer/nginx	# 推送镜像
docker build -t biluoer/nginx .	# 构建镜像
# 保存镜像为一个压缩包
# docker save -o [保存的目标文件名称] [镜像名称]
docker save -o nginx.tar nginx:latest
# 加载压缩包为镜像
docker load -i nginx.tar
# 将某个容器构建为镜像
docker commit -m "提交信息" -a "作者名" 容器名称或id tag名称
# 例如将当前运行的容器nginx构建为镜像
docker commit nginx biluoer/nginx:v1

# 容器相关命令
# 创建并运行一个容器
#--name指定容器名称;-p端口映射;-d后台运行;最后的nginx是镜像名称
docker run --name containerName -p 80:80 -d nginx
# 让运行的容器暂停
docker pause nginx
# 让暂停状态的容器恢复运行
docker unpause 容器名称或容器ID
# 停止运行的容器
docker stop 容器名称或容器ID
# 运行的容器
docker start 容器名称或容器ID
# 删除容器
docker rm 容器名称或容器ID
# 重新运行容器
docker restart 容器名称或容器ID
# 停止并删除容器(stop+rm)
docker rm -f 容器名称或容器ID
# 进入容器,bash-shell类型,还可以为sh等
docker exec -it nginx bash
# 让容器直接使用某命令,例如命令:ip addr
docker exec nginx ip addr

清理

sh 复制代码
#命令可以用于清理磁盘,删除关闭的容器、无用的数据卷和网络,以及dangling镜像(即无tag的镜像)
docker system prune
# 作用和上面一样。-f,表示强制删除,不会询问
docker system prune -f
# 清理更彻底,会把没有正在使用的镜像都删掉(小心使用)
docker system prune -a

文件复制

sh 复制代码
# 本地到服务器
docker cp 本地路径 容器id或者容器名字:容器内路径
# 服务器到本地
docker cp 容器id或者容器名字:容器内路径 本地路径

构建镜像

sh 复制代码
# 使用当前目录的 Dockerfile 创建镜像;-t指定构建出的镜像的tag名称
docker build -t biluoer/ubuntu:v1 . 

上传镜像

sh 复制代码
docker login -u username -p pwd
docker tag hadoop:3.1.3 biluoer/hadoop:3.1.3
docker push biluoer/hadoop:3.1.3

注:

  • 旧版登录成功后,密码会经过base64编码保存在$HOME/用户名/.docker/config.json的auth属性中,进过该命令echo 'auth值' | base64 --decode即可看到明文密码。

  • 新版登录会报错:WARNING! Using --password via the CLI is insecure. Use --password-stdin。不允许密码明文出现,但其实还是登录成功了,密码统一保存到config.json中了。解决方法:

    • 方法1:将密码写到文件中使用:cat .docker.pwd | docker login -u username --password-stdin
    • 方法2:密码保存到环境变量使用,与方法1类似。
    • 方法3:官方推荐了一些工具进行安全的登录。

补充

权限不足

无目录权限

sh 复制代码
#若挂载目录在容器内访问没有权限,可以在挂载时加上参数:
--privileged=true 

无用户权限

bash 复制代码
# 以root用户身份进入容器
docker exec --user root -it kafka bash

容器访问

容器无法连接另一个容器。

  • 方法1:使用主机ip
sh 复制代码
#容器内默认只能访问docker提供的网关,不能访问其他容器。解决方法:run命令时加上参数:
--network=host
#值:bridge(默认,容器不具有一个公有IP)、host(使用宿主机的网络接口和IP地址)、none(使用127.0.0.1的本机网络)...
  • 方法2:--link 参数被用来在容器之间创建网络连接,使得容器可以互相解析对方的名字和访问相应的服务
sh 复制代码
#run命令时加上一下参数
--link 当前运行的容器名称:映射名称
# 然后可以通过映射名称+端口号服务其他容器的服务
  • 方法3:创建网络,让不同容器使用相同的网络(--link参数现已不推荐使用)
sh 复制代码
# 创建桥接网络,bridge是默认驱动,可以不加
docker network create [--driver bridge] hadoop-net
#创建桥接网络,并指定子网配置,范围:192.168.1.1-192.168.1.254
docker network create --subnet=192.168.1.0/24 hadoop-net

jenkins推送镜像失败

登录后使用docker推送没有问题,但使用jenkins推送报错:denied: requested access to the resource is denied。

原因:因为jenkins在推送镜像的时候使用的是jenkins的伪用户,因此无法直接在jenkins完成登录。

解决方法:将之前生成的config.json拷贝到jenkins的目录下即可

sh 复制代码
cd /home/用户名/
cp .docker/config.json /var/lib/jenkins
chown -R jenkins.jenkins .docker

# 如果jenkins是以容器方式安装的
docker cp .docker jenkins:/root/
# 或者先在任务的执行脚本中执行一次登录命令,让它自动生成

修改主机名

直接进入容器中修改/etc/hosts,这种方式在重启容器后,修改的内容会丢失。

如果是容器未运行的状态,通过在使用run命令时加上参数 --hostname 主机名 就可以指定容器运行后的主机名。

编写Dockerfile

sh 复制代码
# 指定基础镜像
FROM ubuntu:16.04
# 配置环境变量,JDK的安装目录
ENV JAVA_DIR=/usr/local

# 拷贝jdk和java项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar

# 安装JDK
RUN cd $JAVA_DIR \
 && tar -xf ./jdk8.tar.gz \
 && mv ./jdk1.8.0_144 ./java8

# 注:如果使用ADD命令,则会自动解压,上面的三条命令就可以变为以下命令
#ADD ./jdk8.tar.gz $JAVA_DIR/
#COPY ./docker-demo.jar /tmp/app.jar
#RUN cd $JAVA_DIR \
# && mv ./jdk1.8.0_144 ./java8

# 配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin

# 暴露端口
EXPOSE 8090
# 注:可以通过ENV命令定义一个端口变量,根据传入的参数动态指定端口
# 例如使用run命令时可以加上参数:-e MY_PORT=8088

# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar
相关推荐
Leighteen几秒前
Docker常用命令
docker·容器
hgdlip3 分钟前
查看ip地址的方法有几种?探索多样方法
运维·服务器·ip地址
丶213616 分钟前
【Nginx】在 Docker 上安装 Nginx 的详细指南
运维·nginx·docker
codelife32129 分钟前
在Docker容器中执行命令
容器
神即道 道法自然 如来31 分钟前
Jenkins怎么设置每日自动执行构建任务?
运维·jenkins
petaexpress37 分钟前
常用的k8s容器网络模式有哪些?
网络·容器·kubernetes
hanniuniu131 小时前
详细解读,F5服务器负载均衡的技术优势
运维·服务器·负载均衡
鱼饼6号1 小时前
Prometheus 上手指南
linux·运维·centos·prometheus
m0_609000423 小时前
向日葵好用吗?4款稳定的远程控制软件推荐。
运维·服务器·网络·人工智能·远程工作
小安运维日记4 小时前
Linux云计算 |【第四阶段】NOSQL-DAY1
linux·运维·redis·sql·云计算·nosql